我有以下JSON文档:
{
"A": "A_VALUE",
"B": {
"C": [
{
"D": {
"E": "E_VALUE1",
"F": "F_VALUE1",
"G": "G_VALUE1"
},
"H": ["01", "23" ]
},
{
"D": {
"E": "E_VALUE2",
"F": "F_VALUE2",
"G": "G_VALUE3"
},
"H": ["45", "67" ]
}
]
}
}
我想使用一个jsonpath2表达式来提取字段H,其中我为E字段指定了一个值, 例如:
$..C[?(@.D.G="G_VALUE1")].H[1]
我用来解析这一点的代码如下(jsonpath版本0.4.3):
from jsonpath2.path import Path
s='{ "A": "A_VALUE", "B": { "C": [ { "D": { "E": "E_VALUE1", "F": "F_VALUE1", "G": "G_VALUE1" }, "H": ["01", "23" ] }, { "D": { "E": "E_VALUE2", "F": "F_VALUE2", "G": "G_VALUE3" }, "H": ["45", "67" ] } ] } }"'
p = Path.parse_str("$..C[?(@.D.E=\"E_VALUE1\")].H[1]")
print ([m.current_value for m in p.match(s)])
输出
[]
现在,如果我在https://jsonpath.com/上使用JsonPath计算器,我会得到下面的结果,这并不是我所需要的
$..C[?(@.D.E="E_VALUE1")].H[1]
输出
[23,67]
但如果我这样改变表达方式,它就会起作用,我就会得到我所需要的
$..C[?(@.D.E=="E_VALUE1")].H[1]
输出
[23]
与其他在线评估器(如https://codebeautify.org/jsonpath-tester)的结果相同
那么,为了正确提取两个必需字段,我应该在JSONPATH2API中使用什么样的正确jsonpath表达式呢
您必须使用
[*]
来访问数组中的单个对象。本守则适用于—您可以从jsonpath2docs中引用此示例
您应该使用
==
语法充分披露:在遇到您的问题之前,我从未听说过jsonpath,但由于对XPath有点熟悉,我想我会读一下这个工具。我遇到了一个可以使用不同的实现来评估Expression的站点:http://jsonpath.herokuapp.com。最终结果是4个实现中的3个无法解析带有
=
的表达式。此外,Goessner实现返回了您没有预料到的结果(所有C元素都匹配,结果为[23,67]
)。对于==
布尔表达式,4个实现中的3个实现提供了[23]
的预期结果。Nebhale实现再次抱怨该表达式相关问题 更多 >
编程相关推荐