Runtime Type Adapter Factory
public final class RuntimeTypeAdapterFactory<T> implements TypeAdapterFactory
Content copied to clipboard
Adapts values whose runtime type may differ from their declaration type. This is necessary when a field's type is not the same type that GSON should create when deserializing that field. For example, consider these types:
{@code * abstract class Shape { * int x; * int y; * } * class Circle extends Shape { * int radius; * } * class Rectangle extends Shape { * int width; * int height; * } * class Diamond extends Shape { * int width; * int height; * } * class Drawing { * Shape bottomShape; * Shape topShape; * } * }
Without additional type information, the serialized JSON is ambiguous. Is the bottom shape in this drawing a rectangle or a diamond?
{@code * { * "bottomShape": { * "width": 10, * "height": 5, * "x": 0, * "y": 0 * }, * "topShape": { * "radius": 2, * "x": 4, * "y": 1 * } * }}
{@code * { * "bottomShape": { * "type": "Diamond", * "width": 10, * "height": 5, * "x": 0, * "y": 0 * }, * "topShape": { * "type": "Circle", * "radius": 2, * "x": 4, * "y": 1 * } * }}
{@code "type"}
) and the type labels ({@code * "Rectangle"}
) are configurable. Registering Types Create a {@code RuntimeTypeAdapterFactory}
by passing the base type and type field name to the of factory method. If you don't supply an explicit type field name, {@code "type"}
will be used. {@code * RuntimeTypeAdapterFactoryshapeAdapterFactory
* = RuntimeTypeAdapterFactory.of(Shape.class, "type");
* }
{@code * shapeAdapterFactory.registerSubtype(Rectangle.class, "Rectangle"); * shapeAdapterFactory.registerSubtype(Circle.class, "Circle"); * shapeAdapterFactory.registerSubtype(Diamond.class, "Diamond"); * }
{@code * Gson gson = new GsonBuilder() * .registerTypeAdapterFactory(shapeAdapterFactory) * .create(); * }
{@code GsonBuilder}
, this API supports chaining: {@code * RuntimeTypeAdapterFactoryshapeAdapterFactory = RuntimeTypeAdapterFactory.of(Shape.class)
* .registerSubtype(Rectangle.class)
* .registerSubtype(Circle.class)
* .registerSubtype(Diamond.class);
* }
{@code * Diamond diamond = new Diamond(); * String json = gson.toJson(diamond, Shape.class); * }
{@code * Shape shape = gson.fromJson(json, Shape.class); * }
Functions
of
Link copied to clipboard
registerSubtype
Link copied to clipboard
RuntimeTypeAdapterFactory<T> registerSubtype(Class<? extends T> type, String label)
Content copied to clipboard