-
Notifications
You must be signed in to change notification settings - Fork 4.3k
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Add fall-back support for "timeless" java.util.Date deserialization in DefaultDateTypeAdapter #2669
Open
MuffinTheMan
wants to merge
2
commits into
google:main
Choose a base branch
from
MuffinTheMan:main
base: main
Could not load branches
Branch not found: {{ refName }}
Loading
Could not load tags
Nothing to show
Loading
Are you sure you want to change the base?
Some commits from the old base branch may be removed from the timeline,
and old review comments may become outdated.
Open
Changes from all commits
Commits
File filter
Filter by extension
Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Add this suggestion to a batch that can be applied as a single commit.
This suggestion is invalid because no changes were made to the code.
Suggestions cannot be applied while the pull request is closed.
Suggestions cannot be applied while viewing a subset of changes.
Only one suggestion per line can be applied in a batch.
Add this suggestion to a batch that can be applied as a single commit.
Applying suggestions on deleted lines is not supported.
You must change the existing code in this line in order to create a valid suggestion.
Outdated suggestions cannot be applied.
This suggestion has been applied or marked resolved.
Suggestions cannot be applied from pending reviews.
Suggestions cannot be applied on multi-line comments.
Suggestions cannot be applied while the pull request is queued to merge.
Suggestion cannot be applied right now. Please check back later.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
This seems a bit brittle for the use case you are describing because the
java.sql.Date
adapter actually uses a hardcoded pattern (with default locale) and not a date style:gson/gson/src/main/java/com/google/gson/internal/sql/SqlDateTypeAdapter.java
Line 52 in 18b0892
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
This is certainly interesting that it's a hardcoded
SimpleDateFormat
in the SQL adapter.Regarding your overall point (being uncertain a change like I'm proposing should be made at all), the logic in
DefaultDateTypeAdapter::deserializeToDate()
is already built to try a couple different methods of parsing, so I don't see much harm in adding one more attempt (though I can see a slippery slope rebuttal that isn't necessarily invalid). If I write a customTypeAdapter
(which is currently my workaround), I have to basically copy the exactDefaultDateTypeAdapter
and make this one change, which seems a bit silly (but maybe it's still the right answer 🤷♂️) for what seems like a pretty valid use-case (see my example code in the PR description). My other alternative is to update classes where fields arejava.util.Date
to be explicitlyjava.sql.Date
where applicable, but this isn't realistic (if we could do this easily, we'd be switching fromDate
to something likeLocalDate
anyway).There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
You can avoid this by writing a
TypeAdapterFactory
which first tries to deserialize asjava.util.Date
and if that fails triesjava.sql.Date
instead:DateSqlFallbackFactory
(click to expand)Note that I haven't tested this extensively, and this implementation is also quite verbose. And if parsing fails, the JSON path in the exception message will not be that helpful, saying
$
(root element) instead of the actual path.If you haven't stored the JSON data for any
java.util.Date
and SQL subclasses persistently yet, then maybe a reliable alternative would be to useGsonBuilder.setDateFormat(String)
to specify a locale insensitive pattern (if possible).