未知字段名时解析json对象
Parse jsonObject when field names are unknowm
我正在尝试从 JsonObject 中提取一些数据。
问题是 json 中的字段具有不可预测的名称。
如何提取具有这种奇怪字段名称的信息?
这是一个例子:
"myObject":{
"216cfa89a2de57554b36b177f0bfbb05":{
},
"0cf9182b5ceba2cb64174141a13e647d":{
},
"eb1d1b19e117ba1387a798d9194b4660":{
},
"157b52871e8e560c7ec0be111ef02363":{
},
"4db69dd3a8ae8e0089bd2959ab0c5f86":{
},
}
我正在使用 gson,其中有方法 getAsJsonObject,但如果我不知道字段名称,我该如何使用它?
JsonObject jsonObject= myObjectJsonObject.getAsJsonObject("???");
另外,字段的数量可以是可变的,这也是一个问题。
我想知道为什么我没有得到一个 json 数组作为响应,它会更合适并且我可以那样解析它。
如果您查看 this post,您会发现您可以简单地执行以下操作:
Object o = new Gson().fromJson(json, Object.class);
返回的对象是 String 的 Map 和 String 或 Map。
在你的情况下最好使用 JsonPath
与 JSON 像这样:
{
"myObject": {
"216cfa89a2de57554b36b177f0bfbb05": {
"field1": true
},
"0cf9182b5ceba2cb64174141a13e647d": {
"field2": true
},
"eb1d1b19e117ba1387a798d9194b4660": {
"field3": true
},
"157b52871e8e560c7ec0be111ef02363": {
"field2": true
},
"4db69dd3a8ae8e0089bd2959ab0c5f86": {
"field5": true
}
}
}
以及 JsonPth 的表达式
$.myObject.*
你会得到一个字段数组
[
{
"field1": true
},
{
"field2": true
},
{
"field3": true
},
{
"field2": true
},
{
"field5": true
}
]
希望有所帮助:)
JsonObject o = new JsonParser().parse("some json string").getAsJsonObject();
String json = "{ 'abcd': { 'a':'d' }, 'dcba': { 'd':'a' } }";
JsonObject o = new JsonParser().parse(json).getAsJsonObject();
for(Map.Entry<String, JsonElement> entry : o.entrySet()) {
System.out.println(entry.getKey());
System.out.println(entry.getValue());
}
或者您可以在加载对象时获取地图:
Map<String, JsonObject> map = new Gson().fromJson(json, new TypeToken<Map<String, JsonObject>>(){}.getType());
for(Map.Entry e : map.entrySet()) {
System.out.println(e.getKey());
System.out.println(e.getValue());
}
}
或者您可以添加一个 JsonDeserializer,它可以将您的 class 反序列化为合理的东西(可能是地图)。
我正在尝试从 JsonObject 中提取一些数据。 问题是 json 中的字段具有不可预测的名称。
如何提取具有这种奇怪字段名称的信息?
这是一个例子:
"myObject":{
"216cfa89a2de57554b36b177f0bfbb05":{
},
"0cf9182b5ceba2cb64174141a13e647d":{
},
"eb1d1b19e117ba1387a798d9194b4660":{
},
"157b52871e8e560c7ec0be111ef02363":{
},
"4db69dd3a8ae8e0089bd2959ab0c5f86":{
},
}
我正在使用 gson,其中有方法 getAsJsonObject,但如果我不知道字段名称,我该如何使用它?
JsonObject jsonObject= myObjectJsonObject.getAsJsonObject("???");
另外,字段的数量可以是可变的,这也是一个问题。 我想知道为什么我没有得到一个 json 数组作为响应,它会更合适并且我可以那样解析它。
如果您查看 this post,您会发现您可以简单地执行以下操作:
Object o = new Gson().fromJson(json, Object.class);
返回的对象是 String 的 Map 和 String 或 Map。
在你的情况下最好使用 JsonPath
与 JSON 像这样:
{
"myObject": {
"216cfa89a2de57554b36b177f0bfbb05": {
"field1": true
},
"0cf9182b5ceba2cb64174141a13e647d": {
"field2": true
},
"eb1d1b19e117ba1387a798d9194b4660": {
"field3": true
},
"157b52871e8e560c7ec0be111ef02363": {
"field2": true
},
"4db69dd3a8ae8e0089bd2959ab0c5f86": {
"field5": true
}
}
}
以及 JsonPth 的表达式
$.myObject.*
你会得到一个字段数组
[
{
"field1": true
},
{
"field2": true
},
{
"field3": true
},
{
"field2": true
},
{
"field5": true
}
]
希望有所帮助:)
JsonObject o = new JsonParser().parse("some json string").getAsJsonObject();
String json = "{ 'abcd': { 'a':'d' }, 'dcba': { 'd':'a' } }";
JsonObject o = new JsonParser().parse(json).getAsJsonObject();
for(Map.Entry<String, JsonElement> entry : o.entrySet()) {
System.out.println(entry.getKey());
System.out.println(entry.getValue());
}
或者您可以在加载对象时获取地图:
Map<String, JsonObject> map = new Gson().fromJson(json, new TypeToken<Map<String, JsonObject>>(){}.getType());
for(Map.Entry e : map.entrySet()) {
System.out.println(e.getKey());
System.out.println(e.getValue());
}
}
或者您可以添加一个 JsonDeserializer,它可以将您的 class 反序列化为合理的东西(可能是地图)。