解析包含更改键的嵌套 JSON 对象

Parsing a nested JSON object containing changing keys

我在 java 中使用 Gson 来解析 JSON 文件。问题是 json 对象包含另一组对象。这不是问题,因为我可以创建另一个 class 并输入到其中。问题是这些子对象包含的键在每个子对象中都可能不同。我不确定如何处理。 这是 JSON:

的截图
[
  {
    "a": "aa",
    "b": 1,
    "c": "cc",
    "d": 2.2,
    "e": 3.3,
    "obj1": {"lu":1,"lo":1},
    "arr1": [],
    "obj2": {}
  },
   {
    "a": "aaa",
    "b": 4,
    "c": "ccc",
    "d": 5.5,
    "e": 6.6,
    "obj1": {"bli":1},
    "arr1": ["Some String"],
    "obj2": {
      "foo": 100,
      "bar": 50,
      "bla": 1
    }
  },
   {
    "a": "aaaa",
    "b": 7,
    "c": "cccc",
    "d": 8.8,
    "e": 9.9,
    "obj1": {},
    "arr1": ["Some String", "Another one"],
    "obj2": {
      "la": 300,
      "le": 20000
    }
  }
]

如您所见,obj1 和 obj2 包含不一致的键。 这是我当前的 jObject class 代码,我将该数据解析为:

public class jObject {
    String a;
    Integer b;
    String c;
    Double d;
    Double e;
//  List<Pair<String,Integer>> obj1;
    List<String> arr1;
//  List<Pair<String,Integer>> obj2;
    
    public jObject(String a, Integer b, String c, Double d, Double e,
                   List<Pair<String,Integer>> obj1, List<String> arr1,List<Pair<String,Integer>> obj2) {
        this.a = a;
        this.b = b;
        this.c = c;
        this.d = d;
        this.e = e;
        
    //  this.obj1 = obj1;
        this.arr1 = arr1;
    //  this.obj2 = obj2;
                   }
}

它适用于所有普通键以及“arr1”数组。

如果你想知道,这是我实际解析它的方式:

Gson gson = new Gson();

Reader reader = Files.newBufferedReader(Paths.get("PATH_TO_JSON"));
List<jObject> objects = gson.fromJson(reader, new TypeToken<List<jObject>>() {}.getType());

我想要实现的是“obj1”和“obj2”将作为 jObject 的一部分保存 class 作为字符串和整数元组的列表。

我搜索了很多,但找不到与这个确切问题相关的任何内容。

提前致谢!

JsonObject 无法轻易解析为列表或数组。但它可以很容易地解析为地图,例如Map 可以使用 entrySet() 方法手动转换为 Set>。

一种更困难的方法是为特定类型实现自己的反序列化器,例如对列表。

您可以使用 Map.

public class jObject {
    String a;
    Integer b;
    String c;
    Double d;
    Double e;
    Map<String,Integer> obj1;
    List<String> arr1;
    Map<String,Integer> obj2;

    public jObject(String a, Integer b, String c, Double d, Double e,
                   Map<String,Integer> obj1, List<String> arr1, Map<String,Integer> obj2) {
        this.a = a;
        this.b = b;
        this.c = c;
        this.d = d;
        this.e = e;

        this.obj1 = obj1;
        this.arr1 = arr1;
        this.obj2 = obj2;
    }
}