使用 jsonpath_ng 检查数组中的元素失败并出现 JsonPathParseError

Posted

技术标签:

【中文标题】使用 jsonpath_ng 检查数组中的元素失败并出现 JsonPathParseError【英文标题】:Checking for an element in an array with jsonpath_ng fails with JsonPathParseError 【发布时间】:2022-01-21 23:36:38 【问题描述】:

我正在尝试使用 Python 中的 jsonpath_ng 过滤我的 JSON 数据中包含特定值的元素。数据看起来像

[
  
    "id": "a",
    "test": [
      "a1",
      "a2"
    ]
  ,
  
    "id": "b",
    "test": [
      "a1",
      "a3"
    ]
  
]

使用查询 $[?(@.test contains "a2")]$[?("a2" in @.test)] 在 PyCharm 中测试数据工作正常并返回预期结果

[
  
    "id": "a",
    "test": [
      "a1",
      "a2"
    ]
  
]

不幸的是,在 Python 中使用 jsonpath_ng 尝试此操作会导致错误...

from jsonpath_ng.ext import parse

a = ["id": "a", "test": ["a1", "a2"], "id": "b", "test": ["a1", "a3"]]

jpexpr = parse('$[?(@.test contains "a2")]')

导致错误jsonpath_ng.exceptions.JsonPathParserError: Parse error at 1:11 near token contains (ID)。使用jpexpr = parse('$[?("a2" in @.test)]') 显示了与jsonpath_ng.exceptions.JsonPathParserError: Parse error at 1:9 near token in (ID) 类似的行为

无论是搜索 Google 还是 SO,如果 jsonpath_ng 存在限制,我都无法找到答案是否我做错了。

jsonpath_ng 中是否不支持此过滤器?如果是这种情况,是否有人有解决方法的好主意?

感谢大家的帮助, .kai

【问题讨论】:

好的,发现有用的数组运算符根本不是“官方”JSON 路径规范的一部分。仍然会感谢建议的解决方法。 我使用的运算符的来源:support.smartbear.com/alertsite/docs/monitors/api/endpoint/… 【参考方案1】:
jpexpr = parse('$[?(@..test[?(@ == "a2")].`len` > 0)]')

为我完成了这项工作......

from jsonpath_ng.ext import parse

a = ["id": "a", "test": ["a1", "a2"], "id": "b", "test": ["a1", "a3"]]

jpexpr = parse('$[?(@..test[?(@ == "a2")].`len` > 0)]')

for i in jpexpr.find(a):
    print(i.value)

导致

'id': 'a', 'test': ['a1', 'a2']

正是我想要的。

【讨论】:

以上是关于使用 jsonpath_ng 检查数组中的元素失败并出现 JsonPathParseError的主要内容,如果未能解决你的问题,请参考以下文章

核心数据谓词 - 检查数组中的任何元素是不是与另一个数组中的任何元素匹配

C ++如何检查数组中的元素是不是相等?

要检查数组是不是仅包含另一个数组中的元素,VB.NET

如何检查 JsonNode 是 Java 中的单个元素还是数组?

检查字符串是不是包含Python中数组中的多个元素

如何根据所述数组的长度重命名数组中的元素? (在 Unity 检查器中)