无法使用Gson

时间:2016-12-07 15:40:23

标签: java json gson

我无法正确地将JSON反序列化为地图中的POJO

我连接到一个webservice,它返回一个JSON字典,其中包含任意数量的键

{ 
    "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(明显减去......)然后我得到了我所期望的HashMap,其中包含2个项目,&#39; arbitray_key_name&#39;,&#39; another_key_name&#39;的键,其中每个值本身都是一个Map,其中包含子对象的正确键/值信息。

但是我有一个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对象中的字段都是null,Json没有被映射到对象中。我究竟做错了什么?

1 个答案:

答案 0 :(得分:2)

我不知道你从哪里获得@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]]}