在JToken查询中使用变量



从文档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()

在这里演示小提琴。

相关内容

  • 没有找到相关文章

最新更新