Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
将2D对象数组反序列化为JSON到Java_Java_Arrays_Json_Deserialization_Gson - Fatal编程技术网

将2D对象数组反序列化为JSON到Java

将2D对象数组反序列化为JSON到Java,java,arrays,json,deserialization,gson,Java,Arrays,Json,Deserialization,Gson,我正在使用GSON反序列化我的JSON字符串。当尝试反序列化2D对象数组时,它似乎会阻塞。以下是要点: { . .. ... "states": [ {"SPAWNINGPHASE": [{"name": "STATEA", "duration": 4}, {"name": "STATEB", "duration": 4}]}, {"ALIVEPHASE": [{"name": "STATEA", "duration": 5}, {"n

我正在使用GSON反序列化我的JSON字符串。当尝试反序列化2D对象数组时,它似乎会阻塞。以下是要点:

{ .
  ..
  ...
  "states": [
            {"SPAWNINGPHASE": [{"name": "STATEA", "duration": 4}, {"name": "STATEB", "duration": 4}]},
            {"ALIVEPHASE": [{"name": "STATEA", "duration": 5}, {"name": "STATEB", "duration": 4}]}
            ]
}
以上是更大的JSON的一部分。 我得到
预期的BEGIN\u数组,但它是BEGIN\u对象
我已经查看了我的JSON,但我不知道哪里不正确

Group g=gson.fromJson(configFile, Group.class);
这就是我开始阅读的原因。这还不足以处理2D数组的字符串吗

在小组课上,我两个都试过了

public State[][] states;

公共列表状态;
其他一切似乎都反序列化了

我必须使用这个(下面)

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

您显示的JSON有一个字段
表示

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

这给POJO的自动反序列化带来了问题

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

Gson会默默地忽略JSON中缺少的任何字段,因此最终得到的是
状态对象的
列表
,其中只设置了一个字段,而所有其他字段都设置为
null

按原样,您需要:

public List<Map<String, List<NameAndDuration>>> states; 
并相应地更改您的
状态
类:

class State {
    String phase;
    List<NameAndDuration> values;
}     
类状态{
串相;
列表值;
}     
(注意,您也可以在此处为
阶段使用
枚举


现在
列出状态变得更加有用。(虽然这似乎有点用词不当;似乎你真的有一个包含状态信息的“阶段”列表,而不是一个“状态”列表。)

谢谢,这是一个很好的解释。选项A对我有效,但我想尝试选项B。从长远来看,它似乎会更容易使用。
class State {
    List<NameAndDuration> SPAWNINGPHASE;
    List<NameAndDuration> ALIVEPHASE;
    ...
}
List<State> states;
public List<Map<String, List<NameAndDuration>>> states; 
{
    "states": [
        {
            "phase": "SPAWNINGPHASE",
            "values": [
                {
                    "name": "STATEA",
                    "duration": 4
                },
                {
                    "name": "STATEB",
                    "duration": 4
                }
            ]
        }
    ]
}
class State {
    String phase;
    List<NameAndDuration> values;
}