-
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
Throw exception when using classes from other JSON libraries with Gson #2452
Open
Marcono1234
wants to merge
8
commits into
google:main
Choose a base branch
from
Marcono1234:marcono1234/unsupported-json-classes-other-library
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 2 commits
Commits
Show all changes
8 commits
Select commit
Hold shift + click to select a range
920366e
Throw exception when using classes from other JSON libraries with Gson
Marcono1234 ac57016
Switch to old JSON-java version to match Android API
Marcono1234 51f4a76
Add test that only requesting adapter does not throw
Marcono1234 19f34fe
Add copyright header
Marcono1234 002e249
Add back accidentally removed sentence
Marcono1234 f358319
Account for different internal field names for JSON-java and Android
Marcono1234 410d1b7
Minor documentation changes
Marcono1234 dc6bf54
Add assertion to avoid warning about dereferencing null for `throw` s…
Marcono1234 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
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
69 changes: 69 additions & 0 deletions
69
...src/main/java/com/google/gson/internal/bind/UnsupportedJsonLibraryTypeAdapterFactory.java
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
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,69 @@ | ||
package com.google.gson.internal.bind; | ||
|
||
import com.google.gson.Gson; | ||
import com.google.gson.TypeAdapter; | ||
import com.google.gson.TypeAdapterFactory; | ||
import com.google.gson.internal.TroubleshootingGuide; | ||
import com.google.gson.reflect.TypeToken; | ||
import com.google.gson.stream.JsonReader; | ||
import com.google.gson.stream.JsonWriter; | ||
import java.io.IOException; | ||
import java.util.Arrays; | ||
import java.util.HashSet; | ||
import java.util.Set; | ||
|
||
/** | ||
* {@code TypeAdapterFactory} which throws an exception when trying to serialize or | ||
* deserialize unsupported classes from third-party JSON libraries. | ||
* | ||
* <p>This is mainly intended as help for users who accidentally mix Gson and non-Gson | ||
* code and are then surprised by unexpected JSON data or issues when trying to | ||
* deserialize the JSON data. | ||
*/ | ||
public class UnsupportedJsonLibraryTypeAdapterFactory implements TypeAdapterFactory { | ||
public static final UnsupportedJsonLibraryTypeAdapterFactory INSTANCE = new UnsupportedJsonLibraryTypeAdapterFactory(); | ||
|
||
private UnsupportedJsonLibraryTypeAdapterFactory() { | ||
} | ||
|
||
// Cover JSON classes from popular libraries which might be used by accident with Gson | ||
// Don't have to cover classes which implement `Collection` / `List` or `Map` because | ||
// Gson's built-in adapters for these types should be able to handle them just fine | ||
private static final Set<String> UNSUPPORTED_CLASS_NAMES = new HashSet<>(Arrays.asList( | ||
// https://github.com/stleary/JSON-java and Android | ||
"org.json.JSONArray", | ||
"org.json.JSONObject", | ||
// https://github.com/eclipse-vertx/vert.x | ||
"io.vertx.core.json.JsonArray", | ||
"io.vertx.core.json.JsonObject" | ||
)); | ||
|
||
@Override | ||
public <T> TypeAdapter<T> create(Gson gson, TypeToken<T> type) { | ||
final String className = type.getRawType().getName(); | ||
if (!UNSUPPORTED_CLASS_NAMES.contains(className)) { | ||
return null; | ||
} | ||
|
||
// Don't directly throw exception here in case no instance of the class is every serialized | ||
// or deserialized, instead only thrown when actual serialization or deserialization attempt | ||
// occurs | ||
return new TypeAdapter<T>() { | ||
private RuntimeException createException() { | ||
// TODO: Use more specific exception type; also adjust Troubleshooting.md entry then | ||
return new RuntimeException("Unsupported class from other JSON library: " + className | ||
+ "\nSee " + TroubleshootingGuide.createUrl("unsupported-json-library-class")); | ||
} | ||
|
||
@Override | ||
public T read(JsonReader in) throws IOException { | ||
throw createException(); | ||
} | ||
|
||
@Override | ||
public void write(JsonWriter out, T value) throws IOException { | ||
throw createException(); | ||
} | ||
}; | ||
} | ||
} |
Oops, something went wrong.
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.
I am not very happy about using such an outdated test dependency, especially because that version does not even have source code or Javadoc available, but it matches the Android API closely and therefore makes it easier to verify that the code in the
JsonOrgInteropTest
test class (which is also shown in the Troubleshooting Guide) compiles for Android as well.