0

所以我目前正在使用一些令牌过滤,并且有一种情况我需要使用 SelectTokens() 方法根据 C# 中的过滤条件过滤令牌,如果单个值与查询匹配,我想要所有对象和/或根元素,为简洁起见,这是我想要将过滤应用于的底层数组之一:

[
  {
    "unitPrice": 5
  },
  {
    "unitPrice": 13
  }
]

例如,如果单个值大于 10,我会想要该数组中的所有元素,否则没有返回值,所以如果我要使用这样的查询:$[?($[?(@.unitPrice >= 10)] empty false)]在我的 SelectTokens() 调用中,我希望返回相同的列表,如果比较值高于 13,则返回一个空数组。

此示例在某些测试人员(例如https://jsonpath.herokuapp.com/ )中查询时工作得很好,但在大多数其他测试人员以及我自己的 C# 代码中似乎无效,我试图找到其他替代方案来获得这个相同的查询功能,每次我找到实现此功能的有效方法时,结果都无法在Newtonsoft.Json.Linq.SelectTokens()我使用的实际方法中工作。

似乎每当我尝试$在实际查询中使用运算符时,它只是拒绝在 newtonsoft 的 jsonpath 实现中工作,而且我似乎找不到试图实现与我相同的事情的人,所以我只是好奇如果有一种简单的方法可以与 newtonsoft 的实现一起使用。

这是我尝试做的最接近的匹配,虽然它是针对单个令牌而不是数组,但它也仅适用于特定测试人员JsonPath: Selecting root level field if satisfies a condition

4

1 回答 1

0

Jayway(您发布的 heroku 链接)做了一些传统 JSON 路径不支持的事情(规范可能不支持)。特别是在你的情况下,这empty false不是一个众所周知的语法,所以我对其他实现不支持它并不感到惊讶。

我可以看到类似的东西

$[?(@[*].unitPrice>=10)]

操作于

[
  [
    {
      "unitPrice": 5
    },
    {
      "unitPrice": 13
    }
  ],
  [
    {
      "unitPrice": 4
    },
    {
      "unitPrice": 8
    }
  ]
]

会产生第一个数组,但不会产生第二个,但就规范而言,我们还没有得到这种内部查询返回多个值的表达式。老实说,我认为这是引发此类讨论的一个很好的例子。一旦它在规范中,实现应该符合它。

我不确定 Newtonsoft 支持什么,但对于它的价值,JsonPath.Net免责声明我的实现)还不支持这个。你可以在https://json-everything.herokuapp.com/json-path上玩它(我只是把站点放好,所以站点可能有一些错误,但库是可靠的:))。

抱歉,这与其说是对事物状态的解释,不如说是一个真正的答案。

于 2021-08-30T13:47:28.650 回答