【发布时间】:2018-12-29 07:37:42
【问题描述】:
我有一个嵌套的 JSON 对象,其中一个嵌套对象(键入 parameters)本身就是一个未知对象。唯一已知的部分是它是一个由更多对象组成的数组。
问题是这个对象的内容是完全未知的(动态的),所以我不能用一些已知的变量名来定义一个类。
我需要实现的是提取和存储所有这些动态键值对。例如在下面的代码中,对于parameters,我需要同时提取alpha,然后提取其内容type,并将它们存储为Map。
js 是我试图解析到我的班级 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());
}
}
如果 JSON 不包含 parameters 块,则通过,否则失败并出现此错误:
原因:java.lang.IllegalStateException:预期 BEGIN_OBJECT 但在第 1 行第 1 列第 206 列路径 $.parameters 处为 BEGIN_ARRAY
【问题讨论】: