如果级别未知,如何从 json 中提取特定对象类型?
How to extract a particular object type from json if the level is not pre-known?
我有一个 json 如下所示(这只是代表性的):
我面临的问题是 Person 对象在 json 中可以处于不同级别。例如。在下面的例子中,RootNode1 是第 2 级,RootNode2 是第 1 级,RootNode2 是第 0 级。当然,这些级别不限于 2,它们也不以任何方式与 RootNode 相关联。 (并且这些节点值不是预先知道的。唯一固定且唯一以标识 Person 对象的是 "Type": "Person"
)
在所有情况下我都必须提取 Person 对象。
有没有办法通过遍历 JsonPath 库来实现:https://github.com/json-path/JsonPath?
[
{
"RootNode1": [
{
"ABC": [
{
"DEF": ""
},
{
"Name": "John",
"Type": "Person"
....
}
]
},
{
"DAC": {}
}
]
},
{
"RootNode2": [
{
"Name": "Williams",
"Type": "Person"
....
}
]
},
{
{
"Name": "Sam",
"Type": "Person"
....
}
}
]
是的,完全有可能。
如果要相信自述文件,他会
JsonPath.read(document, "$.RootNode1.ABC[1].Type");
对于 RootNode1
和
JsonPath.read(document, "$.RootNode2[1].Type");
对于 RootNode2
和
JsonPath.read(document, "$.Type");
这是我看到的唯一方法。不过可能还有更简单的,个人习惯用org.json
如果我没理解错的话,就是这个jsonpath表达式
$..Type
应该输出
[
"Person",
"Person",
"Person"
]
无论 Type
是什么级别。
正确的做法是使用表达式:$..[?(@.Type == 'Person')]
,例如:
ptx.parse(json).read("$..[?(@.Type == 'Person')]", List.class)
// ptx is ParseContext object of com.jayway.jsonpath
有了这个,我可以获得人员列表,而无需关心 Person 对象存在的级别。
我有一个 json 如下所示(这只是代表性的):
我面临的问题是 Person 对象在 json 中可以处于不同级别。例如。在下面的例子中,RootNode1 是第 2 级,RootNode2 是第 1 级,RootNode2 是第 0 级。当然,这些级别不限于 2,它们也不以任何方式与 RootNode 相关联。 (并且这些节点值不是预先知道的。唯一固定且唯一以标识 Person 对象的是 "Type": "Person"
)
在所有情况下我都必须提取 Person 对象。
有没有办法通过遍历 JsonPath 库来实现:https://github.com/json-path/JsonPath?
[
{
"RootNode1": [
{
"ABC": [
{
"DEF": ""
},
{
"Name": "John",
"Type": "Person"
....
}
]
},
{
"DAC": {}
}
]
},
{
"RootNode2": [
{
"Name": "Williams",
"Type": "Person"
....
}
]
},
{
{
"Name": "Sam",
"Type": "Person"
....
}
}
]
是的,完全有可能。
如果要相信自述文件,他会
JsonPath.read(document, "$.RootNode1.ABC[1].Type");
对于 RootNode1
和
JsonPath.read(document, "$.RootNode2[1].Type");
对于 RootNode2
和
JsonPath.read(document, "$.Type");
这是我看到的唯一方法。不过可能还有更简单的,个人习惯用org.json
如果我没理解错的话,就是这个jsonpath表达式
$..Type
应该输出
[
"Person",
"Person",
"Person"
]
无论 Type
是什么级别。
正确的做法是使用表达式:$..[?(@.Type == 'Person')]
,例如:
ptx.parse(json).read("$..[?(@.Type == 'Person')]", List.class)
// ptx is ParseContext object of com.jayway.jsonpath
有了这个,我可以获得人员列表,而无需关心 Person 对象存在的级别。