我使用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);
答案 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中缺少的任何字段,因此您最终得到的是List
个State
个对象,其中只有一个字段设置,其他所有字段都设置为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;
变得更有用了。 (虽然看起来确实有点用词不当;看起来你真的有一个“阶段”列表包含状态信息而不是“状态”列表)