Gson: Is there an easier way to serialize a map

前端 未结 5 2117
野趣味
野趣味 2020-11-28 04:36

This link from the Gson project seems to indicate that I would have to do something like the following for serializing a typed Map to JSON:

    public static         


        
相关标签:
5条回答
  • 2020-11-28 05:19

    Only the TypeToken part is neccesary (when there are Generics involved).

    Map<String, String> myMap = new HashMap<String, String>();
    myMap.put("one", "hello");
    myMap.put("two", "world");
    
    Gson gson = new GsonBuilder().create();
    String json = gson.toJson(myMap);
    
    System.out.println(json);
    
    Type typeOfHashMap = new TypeToken<Map<String, String>>() { }.getType();
    Map<String, String> newMap = gson.fromJson(json, typeOfHashMap); // This type must match TypeToken
    System.out.println(newMap.get("one"));
    System.out.println(newMap.get("two"));
    

    Output:

    {"two":"world","one":"hello"}
    hello
    world
    
    0 讨论(0)
  • 2020-11-28 05:29

    In Gson 2.7.2 it's as easy as

    Gson gson = new Gson();
    String serialized = gson.toJson(map);
    
    0 讨论(0)
  • 2020-11-28 05:31

    Default

    The default Gson implementation of Map serialization uses toString() on the key:

    Gson gson = new GsonBuilder()
            .setPrettyPrinting().create();
    Map<Point, String> original = new HashMap<>();
    original.put(new Point(1, 2), "a");
    original.put(new Point(3, 4), "b");
    System.out.println(gson.toJson(original));
    

    Will give:

    {
      "java.awt.Point[x\u003d1,y\u003d2]": "a",
      "java.awt.Point[x\u003d3,y\u003d4]": "b"
    }
    


    Using enableComplexMapKeySerialization

    If you want the Map Key to be serialized according to default Gson rules you can use enableComplexMapKeySerialization. This will return an array of arrays of key-value pairs:

    Gson gson = new GsonBuilder().enableComplexMapKeySerialization()
            .setPrettyPrinting().create();
    Map<Point, String> original = new HashMap<>();
    original.put(new Point(1, 2), "a");
    original.put(new Point(3, 4), "b");
    System.out.println(gson.toJson(original));
    

    Will return:

    [
      [
        {
          "x": 1,
          "y": 2
        },
        "a"
      ],
      [
        {
          "x": 3,
          "y": 4
        },
        "b"
      ]
    ]
    

    More details can be found here.

    0 讨论(0)
  • 2020-11-28 05:32
    Map<String, Object> config = gson.fromJson(reader, Map.class);
    
    0 讨论(0)
  • 2020-11-28 05:43

    I'm pretty sure GSON serializes/deserializes Maps and multiple-nested Maps (i.e. Map<String, Map<String, Object>>) just fine by default. The example provided I believe is nothing more than just a starting point if you need to do something more complex.

    Check out the MapTypeAdapterFactory class in the GSON source: http://code.google.com/p/google-gson/source/browse/trunk/gson/src/main/java/com/google/gson/internal/bind/MapTypeAdapterFactory.java

    So long as the types of the keys and values can be serialized into JSON strings (and you can create your own serializers/deserializers for these custom objects) you shouldn't have any issues.

    0 讨论(0)
提交回复
热议问题