解析包含更改键的嵌套 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;
}
}
我在 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
一种更困难的方法是为特定类型实现自己的反序列化器,例如对列表。
您可以使用 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;
}
}