【问题标题】:Extract Array of JSONObjects from a nested Json using GSON in java在 Java 中使用 GSON 从嵌套的 Json 中提取 JSONObject 数组
【发布时间】: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

【问题讨论】:

    标签: java json gson


    【解决方案1】:

    一个简单的选择是将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);
    

    nsp 中的 parameters 可能是:

    • com.google.gson.internal.LinkedTreeMap
    • ArrayList 包含上述或其他 ArrayList 等...

    取决于 JSON 中的内容。

    根据您从parameters 找到的内容,您可以在反序列化后采取适当的措施。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多