在java中使用GSON从嵌套Json提取JSONObject数组

在java中使用GSON从嵌套Json提取JSONObject数组,java,json,gson,Java,Json,Gson,我有一个嵌套的JSON对象,其中一个嵌套对象键控参数本身是未知对象。唯一已知的部分是它是一个进一步对象的数组 问题是这个对象的内容是完全未知的动态的,所以我不能用一些已知的变量名来定义一个类 我需要实现的是提取和存储所有这些动态键值对。例如,在下面的代码中,对于参数,我需要提取alpha,然后提取其内容类型,并将它们存储为映射 js是我试图解析到我的类NestedJsonParse中的JSON 公共类NestedJsonParse{ 字符串名; 实验; 参数; NestedJsonParseSt

我有一个嵌套的JSON对象,其中一个嵌套对象键控参数本身是未知对象。唯一已知的部分是它是一个进一步对象的数组

问题是这个对象的内容是完全未知的动态的,所以我不能用一些已知的变量名来定义一个类

我需要实现的是提取和存储所有这些动态键值对。例如,在下面的代码中,对于参数,我需要提取alpha,然后提取其内容类型,并将它们存储为映射

js是我试图解析到我的类NestedJsonParse中的JSON

公共类NestedJsonParse{ 字符串名; 实验; 参数; NestedJsonParseString名称、实验、参数{ this.name=名称; 这个实验=实验; 此参数=参数; } 公共字符串getName{return name;} 公共字符串getExpName{return experiment.getName;} 公共字符串getParams{return parameters.getParamsString;} @凌驾 公共字符串toString{ 返回NSP{+ name='+getName+'\+ ,exp name='+getExpName+'\+ ,params='+getParams+'\+ ======================================== + }; } 公共课堂实验{ 字符串名; 实验字符串名称{ this.name=名称; } 公共字符串getName{return name;} } 公共类参数{ 列出参数; 参数列表参数{ 此参数=参数; } 公共字符串GetParamsAsString{ 返回abc; } } 公共静态无效主字符串[]args引发异常{ 字符串js={\name\:\e0\,\experiment\:{\name\:\e1\},参数\:[{\alpha\:{\type\:\float\}]}; JSONParser=新的JSONParser; Object obj=parser.parsejs;//传递 Gson Gson=new GsonBuilder.create; NestedJsonParse nsp=GSON.fromJsonjs,NestedJsonParse.class;//失败 System.out.printlnNSP:+nsp.toString; } } 如果JSON不包含参数块,则通过此操作,否则失败,并出现以下错误:

原因:java.lang.IllegalStateException:应为BEGIN_对象,但在第1行第206列路径$.parameters处为BEGIN_数组


一个简单的选择就是将参数反序列化为对象,这样就根本没有类参数。NestedJsonParse可以大大简化,如下所示:

@Getter @Setter
public class NestedJsonParse {
    private String name;
    private Experiment experiment;
    private Object parameters;
}
那么当你这么做的时候

NestedJsonParse nsp = GSON.fromJson(js, NestedJsonParse.class);
nsp中的参数可以是:

无效的 com.google.gson.internal.LinkedTreeMap 包含上述内容的ArrayList或其他ArrayList等。。。 取决于JSON中的内容

根据从参数中找到的内容,可以在反序列化后采取适当的操作