使用 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 SomeFieldC
当 SomeFieldA
存在且等于 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() : "";
我正在尝试应用 JSON 路径,该路径仅基于文档中的另一个元素 selects 元素。
例如,对于以下 JSON:
{
'SomeFieldA': 'X',
'SomeFieldB': {
'SomeFieldC': 'Y'
}
}
我只想 select SomeFieldC
当 SomeFieldA
存在且等于 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
-
SomeFieldC
的简单方法
var result = jObject["SomeFieldA"]?.ToString() == "X" ?
jObject["SomeFieldB"]?["SomeFieldC"]?.ToString() : "";