我有一个嵌套的JSON对象,其中一个嵌套对象(键为substring1
substring1
substring1
)是一个未知对象本身。唯一已知的部分是它是其他对象的数组。
问题在于该对象的内容是完全未知的(动态的),因此我无法为其定义具有某些已知变量名称的类。
我需要实现的是提取并存储所有这些动态键值对。例如,在下面的代码中,对于parameters
,我需要同时提取parameters
和内容alpha
,并将它们存储为type
。
Map
是我要解析到我的类js
中的JSON。
NestedJsonParse
如果JSON不包含public class NestedJsonParse {
String name;
Experiment experiment;
Parameters parameters;
NestedJsonParse(String name, Experiment experiment, Parameters parameters) {
this.name = name;
this.experiment = experiment;
this.parameters = parameters;
}
public String getName() { return name; }
public String getExpName() { return experiment.getName(); }
public String getParams() { return parameters.getParamsAsStrings(); }
@Override
public String toString() {
return "NSP{" +
"name='" + getName() + '\'' +
", exp-name='" + getExpName() + '\'' +
", params='" + getParams() + '\'' +
"========================================" +
"}";
}
public class Experiment {
String name;
Experiment(String name) {
this.name = name;
}
public String getName() { return name; }
}
public class Parameters {
List<JSONObject> parameters;
Parameters(List<JSONObject> parameters) {
this.parameters = parameters;
}
public String getParamsAsStrings() {
return "abc";
}
}
public static void main(String[] args) throws Exception {
String js = "{\"name\" : \"e0\", \"experiment\" : { \"name\" : \"e1\" }, \"parameters\" : [ {\"alpha \": { \"type\" : \"float\" } } ] }";
JSONParser parser = new JSONParser();
Object obj = parser.parse(js); // Passes
Gson GSON = new GsonBuilder().create();
NestedJsonParse nsp = GSON.fromJson(js, NestedJsonParse.class); // Fails
System.out.println("NSP : " + nsp.toString());
}
}
块,则失败,否则由于以下错误而失败:
由以下原因引起:java.lang.IllegalStateException:预期为BEGIN_OBJECT,但在行1列206路径$ .parameters处为BEGIN_ARRAY
答案 0 :(得分:0)
一个简单的选择就是将parameters
反序列化为Object
,因此根本没有类Parameters
。您的NestedJsonParse
可以(大大简化)像这样:
@Getter @Setter
public class NestedJsonParse {
private String name;
private Experiment experiment;
private Object parameters;
}
那么当你做
NestedJsonParse nsp = GSON.fromJson(js, NestedJsonParse.class);
您在parameters
中的nsp
可能是:
取决于JSON中的内容。
根据parameters
的发现,您可以在反序列化之后采取适当的措施。