使用JSONPath2从json文档的两个节点提取属性子集

2024-05-23 16:04:22 发布

您现在位置:Python中文网/ 问答频道 /正文

我有以下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表达式呢


Tags: path代码from文档https版本jsonvalue
2条回答

您必须使用[*]来访问数组中的单个对象。本守则适用于—

from jsonpath2.path import Path
import json
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" ] } ] } }'
jso = json.loads(s)
p = Path.parse_str('$..C[*][?(@.D.E="E_VALUE1")].H[1]') # C[*] access each bject in the array
print (*[m.current_value for m in p.match(jso)]) # 23

您可以从jsonpath2docs中引用此示例

您应该使用==语法

充分披露:在遇到您的问题之前,我从未听说过jsonpath,但由于对XPath有点熟悉,我想我会读一下这个工具。我遇到了一个可以使用不同的实现来评估Expression的站点:http://jsonpath.herokuapp.com。最终结果是4个实现中的3个无法解析带有=的表达式。此外,Goessner实现返回了您没有预料到的结果(所有C元素都匹配,结果为[23,67])。对于==布尔表达式,4个实现中的3个实现提供了[23]的预期结果。Nebhale实现再次抱怨该表达式

相关问题 更多 >