【问题标题】:Gson serialization of HashmapsHashmaps的Gson序列化
【发布时间】:2018-09-17 19:01:22
【问题描述】:

我有一个需要序列化的 hashmap 的 hashmap ( Map ) ,目前只处理字符串。 目前使用gson进行序列化。

{cb9b4b3d-8d2e-41b2-9a21-1657dbd14f58={tz:"eeee" dis:"aaaa" geoAddr:"cccc,dddd" id:@cb9b4b3d-8d2e-41b2-9a21-1657dbd14f58 geoState:"dddd" area :1000ft² geoCity:"cccc" bbbb}}

Gson gson = new GsonBuilder().create();
String string = gson.toJson(map);

但似乎通过添加中间键值对和哈希码来改变整体结构,如下所示。

{"cb9b4b3d-8d2e-41b2-9a21-1657dbd14f58":{"map":{"tz":{"val":"eeee"},"dis":{"val":"aaaa"}, "geoAddr":{"val":"cccc,dddd"},"id":{"val":"cb9b4b3d-8d2e-41b2-9a21-1657dbd14f58"},"geoState":{"val":"dddd" },"area":{"val":1000.0,"unit":"ft²"},"geoCity":{"val":"cccc"},"bbbb":{}},"hashCode":0} }

当我将它反序列化回 Map 时,我最终得到了额外的键值对。

Gson gson = new Gson();
Type listType = new TypeToken<Map<String, Map>>()
{
}.getType();
map = gson.fromJson(string, listType); 

{cb9b4b3d-8d2e-41b2-9a21-1657dbd14f58={map={tz={val=eeee}, dis={val=aaaa}, geoAddr={val=cccc,dddd}, id={val=cb9b4b3d -8d2e-41b2-9a21-1657dbd14f58}, geoState={val=dddd}, area={val=1000.0, unit=ft²}, geoCity={val=cccc}, bbbb={}}, hashCode=0.0}}

有没有办法可以将它反序列化为与原来相同的结构。我使用了一个不理解这个反序列化地图的第三方库。

【问题讨论】:

  • 你用的是什么版本的gson?我用 2.8 对此进行了测试,它用原始值序列化了地图。
  • 你在序列化什么Map 类?
  • 我也使用 2.8 并且序列化/反序列化工作。但是反序列化的地图看起来与我最初拥有的不同,就像问题一样。
  • 这是一个地图>
  • 具体实现是什么(即是HashMap还是别的什么)?当我使用 HashMap 进行测试时,我没有看到这种行为。

标签: java serialization gson


【解决方案1】:

这对我有用(gson 2.8):

public static void main(String[] args) {
    String json = "{"
        + "  \"cb9b4b3d-8d2e-41b2-9a21-1657dbd14f58\": {"
        + "    \"tz\": \"eeee\","
        + "    \"dis\": \"aaaa\","
        + "    \"geoAddr\": \"cccc\","
        + "    \"id\": \"cb9b4b3d-8d2e-41b2-9a21-1657dbd14f58\","
        + "    \"geoState\": \"dddd\","
        + "    \"area\": 1000,"
        + "    \"geoCity\": \"cccc\""
        + "  }"
        + "}";

    Gson gson = new GsonBuilder().setPrettyPrinting().create();
    Map<String, Map<String, Object>> map = gson.fromJson(json, new TypeToken<Map<String, Map<String, Object>>>(){}.getType());
    System.out.println("Map.toString() is:");
    System.out.println(map);
    String serialisedMap = gson.toJson(map);
    System.out.println("Map to json is:");
    System.out.println(serialisedMap);
}

打印:

Map.toString() is:
{cb9b4b3d-8d2e-41b2-9a21-1657dbd14f58={tz=eeee, dis=aaaa, geoAddr=cccc, id=cb9b4b3d-8d2e-41b2-9a21-1657dbd14f58, geoState=dddd, area=1000.0, geoCity=cccc}}
Map to json is:
{
  "cb9b4b3d-8d2e-41b2-9a21-1657dbd14f58": {
    "tz": "eeee",
    "dis": "aaaa",
    "geoAddr": "cccc",
    "id": "cb9b4b3d-8d2e-41b2-9a21-1657dbd14f58",
    "geoState": "dddd",
    "area": 1000.0,
    "geoCity": "cccc"
  }
}

【讨论】:

  • 感谢您的建议。我试过了,但结果相同。我对哈希图中的对象类型不正确。就我而言,它确实是抽象类的众多具体实现之一。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-07-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多