public final class MapTypeAdapterFactory extends Object implements TypeAdapterFactory
Maps
to JSON
Objects. This requires that map keys can be serialized as strings; this is
insufficient for some key types. For example, consider a map whose keys are
points on a grid. The default JSON form encodes reasonably:
{ @code Maporiginal = new LinkedHashMap (); original.put(new Point(5, 6), "a"); original.put(new Point(8, 8), "b"); System.out.println(gson.toJson(original, type)); }
The above code prints this JSON object:
{
"(5,6)": "a",
"(8,8)": "b"
}
But GSON is unable to deserialize this value because the JSON string name is
just the toString()
of the map key. Attempting to
convert the above JSON to an object fails with a parse exception:
com.google.JsonParseException: Expecting object found: "(5,6)" at com.google.gson.JsonObjectDeserializationVisitor.visitFieldUsingCustomHandler at com.google.gson.ObjectNavigator.navigateClassFields ...
Register this adapter when you are creating your GSON instance.
{ @code Gson gson = new GsonBuilder().registerTypeAdapter(Map.class, new MapAsArrayTypeAdapter()).create(); }
This will change the structure of the JSON emitted by the code above. Now we get an array. In this case the arrays elements are map entries:
[
[
{
"x": 5,
"y": 6
},
"a",
],
[
{
"x": 8,
"y": 8
},
"b"
]
]
This format will serialize and deserialize just fine as long as this adapter is registered.
Constructor and Description |
---|
MapTypeAdapterFactory(ConstructorConstructor constructorConstructor,
boolean complexMapKeySerialization) |
Modifier and Type | Method and Description |
---|---|
<T> TypeAdapter<T> |
create(Gson gson,
TypeToken<T> typeToken)
Returns a type adapter for
type , or null if this factory doesn't
support type . |
public MapTypeAdapterFactory(ConstructorConstructor constructorConstructor, boolean complexMapKeySerialization)
public <T> TypeAdapter<T> create(Gson gson, TypeToken<T> typeToken)
TypeAdapterFactory
type
, or null if this factory doesn't
support type
.create
in interface TypeAdapterFactory