如何在 JsonPath 中过滤非数组

问题描述 投票:0回答:2

使用以下 JSON(来自 http://jsonpath.com):

{
  "firstName": "John",
  "lastName" : "doe",
  "age"      : 26,
  "address"  : {
    "streetAddress": "naist street",
    "city"         : "Nara",
    "postalCode"   : "630-0192"
  },
  "phoneNumbers": [
    {
      "type"  : "iPhone",
      "number": "0123-4567-8888"
    },
    {
      "type"  : "home",
      "number": "0123-4567-8910"
    }
  ]
}

我只想在 firstName 是 John 的情况下获取根对象。

我已经尝试过这些输入和许多其他类似的输入:

  • $.[?($.firstName == 'John')]
  • $.[?($.'firstName' == 'John')]
  • $.[?(@.firstName == 'John')]
  • $[?($.firstName == "John")]

过滤似乎只适用于数组,所以这是一个不受支持的功能。有人知道在 Json.NET 中执行此操作的方法,或者确认这是不可能的并且可能会指出我支持上述内容的库吗?

我正在使用 F#,但这并不重要,因为 F# 与 C#、.NET 和 NuGet 包兼容。

json.net jsonpath
2个回答
6
投票

JSON 路径旨在定位 JSON 对象中的数据,而不是对该数据执行某些处理或测试。过滤器符号用于标识数组中的项目,目的是返回该数据或其中的某些部分。在数组中拥有对象意味着可能有许多具有相同名称的属性,必须通过其他方式进行过滤才能选择其中的一个子集。
在对象属性上使用过滤器符号不是一回事。一个对象中只能有一个具有特定名称的属性,因此声明该名称足以唯一地标识它。您可以通过获取 $.firstName 然后单独测试值 "John"

来轻松实现所需的效果

0
投票

虽然安迪的答案是正确的,但还是有办法作弊的。问题的核心是过滤器仅适用于数组,因此解决方案是将您的 json 对象包装在一个数组中。考虑一下:

$.arr[?(@.firstName == 'John')]

让它成为你的 jsonpath 表达式,然后你继续在你的代码中执行此操作:(以 python 为例,因为这是我正在使用的,但同样适用于任何语言)

tmp_json_obj = json_obj
if jsonpath_str.startswith("$.arr["):
  tmp_json_obj = {"arr": [tmp_json_obj]}
matches = parse(jsonpath_str).find(tmp_json_obj)
if len(matches) > 0:
  print("success, your condition matches the object")
else:
  print("fail, your condition does not match the object")

此实现使您的其他jsonpath查询正常工作,并且对于需要有条件地验证顶级对象的情况,您只需在表达式中添加

$.arr[
并确保在过滤器中使用@而不是$来引用到你的根对象

© www.soinside.com 2019 - 2024. All rights reserved.