如何在Newtonsoft.Json中使用JPath筛选不包含指定属性的结果?
在Json.NET中筛选不包含特定属性的JSON节点
当然可以实现!Json.NET完全支持通过JPath表达式筛选不包含指定属性的节点,只需要在判断条件前加上逻辑非运算符!即可。
针对你给出的示例数据,要筛选所有不包含isbn属性的书籍,只需要把原来的表达式改成:
jToken.SelectTokens("$..book[?(!@.isbn)]")
完整示例代码
为了更清晰地展示效果,这里给出可运行的代码片段:
using Newtonsoft.Json.Linq; using System; class Program { static void Main() { string json = @"{ ""store"": { ""book"": [ { ""category"": ""reference"", ""author"": ""Nigel Rees"", ""title"": ""Sayings of the Century"", ""price"": 8.95 }, { ""category"": ""fiction"", ""author"": ""Evelyn Waugh"", ""title"": ""Sword of Honour"", ""price"": 12.99 }, { ""category"": ""fiction"", ""author"": ""Herman Melville"", ""title"": ""Moby Dick"", ""isbn"": ""0-553-21311-3"", ""price"": 8.99 }, { ""category"": ""fiction"", ""author"": ""J. R. R. Tolkien"", ""title"": ""The Lord of the Rings"", ""isbn"": ""0-395-19395-8"", ""price"": 22.99 } ], ""bicycle"": { ""color"": ""red"", ""price"": 19.95 } } }"; JToken jToken = JToken.Parse(json); var booksWithoutIsbn = jToken.SelectTokens("$..book[?(!@.isbn)]"); foreach (var book in booksWithoutIsbn) { Console.WriteLine($"Title: {book["title"]}, Author: {book["author"]}"); } } }
代码运行结果
这段代码会输出前两本没有isbn属性的书籍:
Title: Sayings of the Century, Author: Nigel Rees
Title: Sword of Honour, Author: Evelyn Waugh
原理说明
@代表当前节点,@.isbn检查当前书籍节点是否包含isbn属性;!是逻辑非运算符,将原来的判断结果取反,从而筛选出不包含该属性的节点;- Json.NET的JPath实现完全支持这种逻辑运算,和你用来筛选包含属性的表达式是对称的用法。
内容的提问来源于stack exchange,提问作者luruibo
相关产品推荐
相关产品推荐

