使用 Newtonsoft 将带有表达式过滤器的 JSON 路径应用于非数组 JSON 元素

Applying a JSON path with an expression filter to a non-array JSON element with Newtonsoft

我正在尝试应用 JSON 路径,该路径仅基于文档中的另一个元素 selects 元素。

例如,对于以下 JSON:

{
    'SomeFieldA': 'X',
    'SomeFieldB': {
         'SomeFieldC': 'Y'
     }
}

我只想 select SomeFieldCSomeFieldA 存在且等于 X

我试过 运行 下面的表达式 $.SomeFieldB[?($.SomeFieldA == 'X')].SomeFieldC 尽管它在某些实现中有效(例如 https://jsonpath.herokuapp.com/),但它似乎不适用于 Newtonsoft (JSON.NET)

以下代码对我不起作用(returns 一个空列表):

var jsonObject = JObject.Parse(@"
    {
        'SomeFieldA': 'X',
        'SomeFieldB': {
            'SomeFieldC': 'Y'

        }
    }");

Console.WriteLine(string.Join(
    Environment.NewLine,
    jsonObject.SelectTokens("$.SomeFieldB[?($.SomeFieldA == 'X')].SomeFieldC")
        .Select(token => token.ToString())));

我知道我可以通过简单的 LINQ 查询获得此行为,但我有一个只能使用 JSON 路径的框架,所以我想找到一个 JSON 路径来完成那。

我的猜测是 Newtonsoft 不喜欢过滤器表达式中的 $。这似乎没有在 implementation comparison project.

中进行测试

我们已经决定使用它是有效的,但是,作为effort to standardize JSON Path的一部分。

如果您需要支持此功能的 .Net 实现,请查看我的 JsonPath.Net

如果您受困于 Newtonsoft,请尝试 https://www.nuget.org/packages/JsonPath/。虽然没有保证。

这是根据条件 SomeFieldA == X-

select SomeFieldC 的简单方法
var result = jObject["SomeFieldA"]?.ToString() == "X" ? 
             jObject["SomeFieldB"]?["SomeFieldC"]?.ToString() : "";