从文档https://www.newtonsoft.com/json/help/html/SelectToken.htm
IEnumerable<JToken> price = o.SelectTokens("$..Products[?(@.Name == "AAA")].Price");
我如何重新编写上面的查询,其中我必须从列表["AAA", "BBB", "CCC"]
中找到与多个产品名称匹配的价格
请考虑在您提供的同一链接中使用SelectToken和LINQ。
为了实现你的目标,你可以写这样的东西:
var names = new string[]{"AAA", "BBB", "CCC"};
var prices = o.SelectTokens("$..Products[*]")
.Where(p => names.Contains((string)p["Name"]))
.Select(p => (decimal)p["Price"])
.ToList();
您可以在JSONPath查询中使用逻辑OR运算符||
:
var query = "$..Products[?(@.Name == 'AAA' || @.Name == 'BBB' || @.Name == 'CCC')].Price";
var prices = o.SelectTokens(query);
如果你需要从一些运行时的名称数组构建查询,你可以这样做,例如使用LINQ如下:
var names = new []{ "AAA", "BBB", "CCC" }; // Or whatever
var query = names.Select((n, i) => (n, i))
.Aggregate(new StringBuilder("$..Products[?("),
(sb, p) => sb.Append(p.i == 0 ? "" : "||").Append("@.Name=='").Append(p.n).Append("'"))
.Append(")].Price")
.ToString();
var prices = o.SelectTokens(query);
请注意,JToken.SelectToken()
旨在返回单个令牌,如果匹配多个令牌,则会引发异常。如果希望返回多个令牌,请使用JToken.SelectTokens()
。
在这里演示小提琴。