在Java中使用GSON从嵌套Json提取JSONObjects数组

时间:2018-12-28 20:15:43

标签: java json gson

我有一个嵌套的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

1 个答案:

答案 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可能是:

  • com.google.gson.internal.LinkedTreeMap
  • 包含上面提到的ArrayList或其他ArrayList等...

取决于JSON中的内容。

根据parameters的发现,您可以在反序列化之后采取适当的措施。