MapTypeAdapterFactory
Date: 2016-11-03

com.google.gson.internal.bind

## Class MapTypeAdapterFactory

- java.lang.Object
- - com.google.gson.internal.bind.MapTypeAdapterFactory

- All Implemented Interfaces:
    TypeAdapterFactory

      public final class MapTypeAdapterFactory
      extends java.lang.Object
      implements TypeAdapterFactory

  Adapts maps to either JSON objects or JSON arrays.

  ### Maps as JSON objects

  For primitive keys or when complex map key serialization is not enabled, this converts Java `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:

         Map<Point, String> original = new LinkedHashMap<Point, String>();
         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.gson.JsonParseException: Expecting object found: "(5,6)"
         at com.google.gson.JsonObjectDeserializationVisitor.visitFieldUsingCustomHandler
         at com.google.gson.ObjectNavigator.navigateClassFields
         ...

  ### Maps as JSON arrays

  An alternative approach taken by this type adapter when it is required and complex map key serialization is enabled is to encode maps as arrays of map entries. Each map entry is a two element array containing a key and a value. This approach is more flexible because any type can be used as the map's key; not just strings. But it's also less portable because the receiver of such JSON must be aware of the map entry convention.

  Register this adapter when you are creating your GSON instance.

         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 Summary

    Constructors
    Constructor and Description
    `MapTypeAdapterFactory(ConstructorConstructor constructorConstructor, boolean complexMapKeySerialization)`

  - ### Method Summary

    Methods
    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`.

    - ### Methods inherited from class java.lang.Object

      `clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait`

- - ### Constructor Detail

    - #### MapTypeAdapterFactory

          public MapTypeAdapterFactory(ConstructorConstructor constructorConstructor,
                               boolean complexMapKeySerialization)

  - ### Method Detail

    - #### create

          public <T> TypeAdapter<T> create(Gson gson,
                                  TypeToken<T> typeToken)

      Description copied from interface: `TypeAdapterFactory`
      Returns a type adapter for `type`, or null if this factory doesn't support `type`.
      Specified by:
        `create` in interface `TypeAdapterFactory`