将对象的二维数组JSON反序列化为Java

时间:2014-04-28 21:36:32

标签: java arrays json deserialization gson

我使用GSON反序列化我的JSON字符串。在尝试反序列化2D对象数组时似乎会窒息。这就是:

{ .
  ..
  ...
  "states": [
            {"SPAWNINGPHASE": [{"name": "STATEA", "duration": 4}, {"name": "STATEB", "duration": 4}]},
            {"ALIVEPHASE": [{"name": "STATEA", "duration": 5}, {"name": "STATEB", "duration": 4}]}
            ]
}

以上是更大的JSON的一部分。 我得Expected BEGIN_ARRAY but was BEGIN_OBJECT 我查看了我的JSON,但我不知道它在哪里不正确

Group g=gson.fromJson(configFile, Group.class);

这是我用来开始阅读的内容。这还不足以处理2D数组的字符串吗?

在Group.class中我尝试了两个

public State[][] states;

public List<List<State>> states;

其他所有东西似乎都在反序列化。

我是否必须使用此(下方)?

Type collectionType = new TypeToken<Collection<Integer>>(){}.getType();
Collection<Integer> ints2 = gson.fromJson(json, collectionType);

1 个答案:

答案 0 :(得分:1)

您展示的JSON有一个字段states

该字段包含一个数组,您显示该数组包含两个不同类型的对象。一个有字段SPAWNINGPHASE,另一个有字段ALIVEPHASE。其中每个都包含一个包含其他类型对象的数组。

这给POJO的自动去驯化带来了问题。

唯一可行的方法是,如果你的State类为每个“阶段”都有字段(假设你有一个名为NameAndDuration的Java类,你可以将这些内部对象映射到)

class State {
    List<NameAndDuration> SPAWNINGPHASE;
    List<NameAndDuration> ALIVEPHASE;
    ...
}

如果您的意思是Group类表示JSON对象,则它将具有:

List<State> states;

Gson默默地忽略JSON中缺少的任何字段,因此您最终得到的是ListState个对象,其中只有一个字段设置,其他所有字段都设置为null 1}}。

按原样你需要:

public List<Map<String, List<NameAndDuration>>> states; 

JSON对象本质上是一个键/值映射,因为数组中的那些对象是常见类型,所以它可以工作。你有一个List包含Map个,每个都有一个条目,“阶段”作为键,以及这些内部对象的列表。不完全理想,但它会起作用。

选项B和更有意义的东西是改变JSON,因此“阶段”是

{
    "states": [
        {
            "phase": "SPAWNINGPHASE",
            "values": [
                {
                    "name": "STATEA",
                    "duration": 4
                },
                {
                    "name": "STATEB",
                    "duration": 4
                }
            ]
        }
    ]
}

相应地更改State课程:

class State {
    String phase;
    List<NameAndDuration> values;
}     

(请注意,此处enum也可以使用phase

现在List<State> states;变得更有用了。 (虽然看起来确实有点用词不当;看起来你真的有一个“阶段”列表包含状态信息而不是“状态”列表)