public class PointAdapter extends TypeAdapter<Point> {
public Point read(JsonReader reader) throws IOException {
if (reader.peek() == JsonToken.NULL) {
reader.nextNull();
return null;
}
String xy = reader.nextString();
String[] parts = xy.split(",");
int x = Integer.parseInt(parts[0]);
int y = Integer.parseInt(parts[1]);
return new Point(x, y);
}
public void write(JsonWriter writer, Point value) throws IOException {
if (value == null) {
writer.nullValue();
return;
}
String xy = value.getX() + "," + value.getY();
writer.value(xy);
}
}
With this type adapter installed, Gson will convert Points to JSON as strings like "5,8" rather than objects like {"x":5,"y":8}. In this case the type adapter binds a rich
Java class to a compact JSON value.
The read() method must read exactly one value and write() must write exactly one value. For primitive types this is
means readers should make exactly one call to nextBoolean(), nextDouble(), nextInt(), nextLong(), nextString() or nextNull(). Writers should make
exactly one call to one of value() or nullValue(). For arrays, type adapters
should start with a call to beginArray(), convert all elements, and finish with a call to
endArray(). For objects, they should start with beginObject(), convert the
object, and finish with endObject(). Failing to convert a value or converting too many
values may cause the application to crash.
Type adapters should be prepared to read null from the stream and write it to the stream.
Alternatively, they should use nullSafe() method while registering the type adapter with
Gson. If your Gson instance has been configured to GsonBuilder#serializeNulls(),
these nulls will be written to the final document. Otherwise the value (and the corresponding
name when writing to a JSON object) will be omitted automatically. In either case your type
adapter must handle null.
Type adapters should be stateless and thread-safe, otherwise the thread-safety guarantees of
Gson might not apply.
To use a custom type adapter with Gson, you must register it with a GsonBuilder:
GsonBuilder builder = new GsonBuilder();
builder.registerTypeAdapter(Point.class, new PointAdapter());
// if PointAdapter didn't check for nulls in its read/write methods, you should instead use
// builder.registerTypeAdapter(Point.class, new PointAdapter().nullSafe());
...
Gson gson = builder.create();
| Modifier and Type | Class and Description |
|---|---|
| private class |
| Access | Constructor and Description |
|---|---|
| public |
| Modifier and Type | Method and Description |
|---|---|
| public final T | |
| public final T | |
| public final T | Returns: the converted Java object. May benull.the JSON element to convert. May be jsonTree)JsonNull.Converts |
| public final TypeAdapter | |
| public abstract T | Returns: the converted Java object. May benull.Reads one JSON value (an array, object, string, number, boolean or null) and converts it to a Java object. |
| public final void | |
| public final String | |
| public final JsonElement | Returns: the converted JSON tree. May beJsonNull.the Java object to convert. May be value)null.Converts |
| public abstract void | write(JsonWriter out, T
the Java object to write. May be null. value)Writes one JSON value (an array, object, string, number, boolean or null) for |
| TypeAdapter | back to summary |
|---|---|
| public TypeAdapter() | |
| fromJson | back to summary |
|---|---|
| public final T fromJson(Reader in) throws IOException Converts the JSON document in A No exception is thrown if the JSON data has multiple top-level JSON elements, or if there is trailing data.
| |
| fromJson | back to summary |
|---|---|
| public final T fromJson(String json) throws IOException Converts the JSON document in A No exception is thrown if the JSON data has multiple top-level JSON elements, or if there is trailing data.
| |
| fromJsonTree | back to summary |
|---|---|
| public final T fromJsonTree(JsonElement jsonTree) Converts
| |
| nullSafe | back to summary |
|---|---|
| public final TypeAdapter This wrapper method is used to make a type adapter null tolerant. In general, a type adapter is
required to handle nulls in write and read methods. Here is how this is typically done:
You can avoid this boilerplate handling of nulls by wrapping your type adapter with this
method. Here is how we will rewrite the above example:
Note that we didn't need to check for nulls in our type adapter after we used nullSafe.
| |
| read | back to summary |
|---|---|
| public abstract T read(JsonReader in) throws IOException Reads one JSON value (an array, object, string, number, boolean or null) and converts it to a Java object. Returns the converted object.
| |
| toJson | back to summary |
|---|---|
| public final void toJson(Writer out, T value) throws IOException Converts A
| |
| toJson | back to summary |
|---|---|
| public final String toJson(T value) Converts A
| |
| toJsonTree | back to summary |
|---|---|
| public final JsonElement toJsonTree(T value) Converts
| |
| write | back to summary |
|---|---|
| public abstract void write(JsonWriter out, T value) throws IOException Writes one JSON value (an array, object, string, number, boolean or null) for
| |
| Access | Constructor and Description |
|---|---|
| private |
| Modifier and Type | Method and Description |
|---|---|
| public T | read(JsonReader reader)
Implements abstract com. Reads one JSON value (an array, object, string, number, boolean or null) and converts it to a Java object. |
| public String | |
| public void | write(JsonWriter out, T value)
Implements abstract com. Writes one JSON value (an array, object, string, number, boolean or null) for |
| NullSafeTypeAdapter | back to summary |
|---|---|
| private NullSafeTypeAdapter() | |
| read | back to summary |
|---|---|
| public T read(JsonReader reader) throws IOException Implements abstract com. Doc from com. Reads one JSON value (an array, object, string, number, boolean or null) and converts it to a Java object. Returns the converted object.
| |
| toString | back to summary |
|---|---|
| public String toString() Overrides java. Doc from java. Returns a string representation of the object.
Satisfying this method's contract implies a non-
| |
| write | back to summary |
|---|---|
| public void write(JsonWriter out, T value) throws IOException Implements abstract com. Doc from com. Writes one JSON value (an array, object, string, number, boolean or null) for
| |