gpt4 book ai didi

c# - 使用 Json.NET 测试嵌套键?

转载 作者:太空宇宙 更新时间:2023-11-03 23:10:38 24 4
gpt4 key购买 nike

我想像这样过滤 json 编码字符串的 react 流:

{ "Key1" : {"key2":"value"},
"key3" : "other values"
}

我想过滤对 key2 有一定值(value)的项目,如下所示:

IDisposable valueQuery = globalEventStream
.Select(e => JObject.Parse(e.EventArgs.Data))
.Where(e => e["key1"]["key2"] != null)

但这给了我错误

Cannot access child value on Newtonsoft.Json.Linq.JValue

我能找到解决这个问题的唯一方法是执行以下操作:

IDisposable deathDisposable = globalEventStream
.Select(e => JObject.Parse(e.EventArgs.Data))
.Where(e => e["key1"] != null).Select(e => e["key1"])
.Where(e => e["key2"] != null).Select(e => e["key2"])

有没有一种方法可以使用单个 Where 语句来过滤嵌套键?

最佳答案

您可以使用 JToken.SelectTokens()在 LINQ to JSON 对象上运行嵌套查询:

var valueQuery = globalEventStream
.Select(e => JObject.Parse(e.EventArgs.Data))
.Where(o => o.SelectTokens("Key1.key2").Any());

样本 fiddle .

JSONPath 的规范是 here并支持以下查询语法:

XPath   JSONPath    Description
/ $ the root object/element
. @ the current object/element
/ . or [] child operator
.. n/a parent operator
// .. recursive descent. JSONPath borrows this syntax from E4X.
* * wildcard. All objects/elements regardless their names.
@ n/a attribute access. JSON structures don't have attributes.
[] [] subscript operator. XPath uses it to iterate over element collections and for predicates. In Javascript and JSON it is the native array operator.
| [,] Union operator in XPath results in a combination of node sets. JSONPath allows alternate names or array indices as a set.
n/a [start:end:step] array slice operator borrowed from ES4.
[] ?() applies a filter (script) expression.
n/a () script expression, using the underlying script engine.
() n/a grouping in Xpath

例如,对于以下 JSON:

{ "Key1" : [{"NoKey2":"value"}, {"key2":"value"}],  "key3" : "other values" }

您可以使用通配符 * 来测试数组中是否存在具有 "key2" 属性的任何项目,如下所示:

var valueQuery = globalEventStream
.Select(e => JObject.Parse(e.EventArgs.Data))
.Where(o => o.SelectTokens("Key1[*].key2").Any());

在这里Enumerable.Any()测试 SelectTokens() 查询是否找到了多个零结果——即 "Key1" 数组中是否至少有一个条目带有 "key2" 属性。它比做 Enumerable.Count() 更有效率因为它会在返回一个项目后立即停止评估。

关于c# - 使用 Json.NET 测试嵌套键?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39335994/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com