2016-12-07 147 views
1
我无法正确地deserialising JSON到POJO的是在地图

未能反序列化JSON来的HashMap <字符串,POJO>与GSON

我连接到一个返回JSON字典中键的arbitary数量web服务

看起来像

{ 
    "arbitray_key_name": { 
     "foo_sticks": "objectName" 
     "bar_socks": ["A", "B"] 
    }, 
    "another_key_name: { 
     "foo_sticks": "differentName" 
     "bar_socks": ["C", "D", "E"] 
    } 
    ... 
} 

我正在使用Gson反序列化成一个HashMap。如果我做

HashMap<String, Object> map = new Gson().fromJson(jsonString, new TypeToken<HashMap<String, Object>>() {}.getType()); 

上述JsonData(减...显然)然后我得到正是我期待这是2项是一个HashMap,“arbitray_key_name”,“another_key_name”,其中每个值的键本身就是一个包含子对象的正确键/值信息的Map。

但是我有我想deserialise眺望该值的POJO类像

public class FooInfo { 
    @Key("foo_sticks") 
    public String fooSticks; 

    @Key("bar_socks") 
    public String[] barSocks; 
} 

如果我尝试做

HashMap<String, FooInfo> map = new Gson().fromJson(jsonString, new TypeToken<HashMap<String, FooInfo>>() {}.getType()); 

然后我回来的两个项目,其中一个HashMap每个值都是FooInfo,但两个FooInfo对象中的字段均为空,Json尚未映射到对象中。我究竟做错了什么?

+1

嗯,这似乎在这种情况下工作。然而,它破坏了一些其他代码对POJO进行反序列化(一个HTTP端点只响应一个没有键入字典的FooInfo对象)。 使用'@ Key'回到POJO的版本我使用Google的http-client库获取Json,结果是我做了Map dict =(Map ) response.parseAs(new TypeToken >(){} .getType());'这是双倍混淆的工作。 –

回答

1

我不知道你从哪里得到@Key注释,但是Gson使用@SerializedName

做出这样的转变之后,我有类:

public class FooInfo { 
    @SerializedName("foo_sticks") 
    public String fooSticks; 

    @SerializedName("bar_socks") 
    public String[] barSocks; 

    @Override 
    public String toString() { 
     return "FooInfo [fooSticks=" + fooSticks + ", barSocks=" + Arrays.toString(barSocks) + "]"; 
    } 
} 

然后,解析JSON:

{ 
    "arbitray_key_name": { 
     "foo_sticks": "objectName", 
     "bar_socks": ["A", "B"] 
    }, 
    "another_key_name": { 
     "foo_sticks": "differentName", 
     "bar_socks": ["C", "D", "E"] 
    } 
} 

我可以正常读取对象:

HashMap<String, FooInfo> map = new Gson().fromJson(jsonString, new TypeToken<HashMap<String, FooInfo>>() {}.getType()); 
System.out.println(map); 

而且得到您的预期输出:

{another_key_name=FooInfo [fooSticks=differentName, barSocks=[C, D, E]], arbitray_key_name=FooInfo [fooSticks=objectName, barSocks=[A, B]]} 
+1

正如我在上面的评论中所说的,我将它与Google的http-client lib一起使用,它需要密钥注释。使用'@ SerializedNames'作为我在我的问题中列出的用例,谢谢。 使用@Key在使用正确的'parseAs'方法时使用了http-client,正如我在我的评论中所述 –