asp.net Newtonsoft.JSON中使用JSONPath检索json字符串内容详解 与xpath比较

XML的一个经常强调的优点是,它提供了大量的工具来分析、转换和有选择地从XML文档中提取数据。XPath就是这些功能强大的工具之一。
不需要特殊的脚本,就可以在客户机上交互式地从JSON结构中发现和提取数据。
客户端请求的JSON数据可以减少到服务器上的相关部分,这样可以最大限度地减少服务器响应的带宽使用。
下面的XPath表达式
/store/book[1]/title
看起来像
$.store.book[0].title

$['store']['book'][0]['title']

JSONPath表达式总是引用JSON结构,其方式与XPath表达式与XML文档结合使用的方式相同。由于JSON结构通常是匿名的,并且并不一定具有“根成员对象”,所以JSONPath假定将抽象名称$分配给外层对象。
JSONPath表达式可以使用点符号
$.store.book[0].title
或中括号
$['store']['book'][0]['title']
JSONPath允许成员名和数组索引使用通配符*。它借用了后代操作符'..'来自E4X和ECMASCRIPT 4中的数组切片语法建议[start:end:step]。
底层脚本语言的表达式()可以用作显式名称或索引的替代
$.store.book[(@.length-1)].title
对当前对象使用符号“@”。过滤器表达式通过语法?()支持,像这样
$.store.book[?(@.price < 10)].title
下面是一个完整的概述,并对JSONPath语法元素与XPath语法元素进行了比较。
XPath JSONPath Description
/ $ 根对象/元素
. @ 当前对象/元素
/ . or [] 子操作符
.. n/a 父操作符
// .. 递归循环。JSONPath从E4X中借用了这种语法。
* * 通配符。所有对象/元素,不论它们的名称。
@ n/a 属性的访问。JSON结构没有属性。
[] [] 下标操作符。XPath使用它迭代元素集合和谓词。在Javascript和JSON中,它是原生数组操作符。
| [,] XPath中的Union操作符导致节点集的组合。JSONPath允许将替代名称或数组索引作为一个集合。
n/a [start:end:step] 数组分隔操作符借用自ES4。
[] ?() 应用筛选器(脚本)表达式。
n/a () 脚本表达式,使用底层脚本引擎。
() n/a Xpath中分组

XPath提供的功能(非缩写语法中的位置路径、操作符和函数)比这里列出的多得多。此外,下标运算符在Xpath和JSONPath中的工作方式也有显著差异。
XPath表达式中的方括号总是对前一个路径片段生成的节点集进行操作。下标总是从1开始。
使用JSONPath方括号对前面路径片段所寻址的对象或数组进行操作。下标总是从0开始。

让我们看一个例子来练习JSONPath表达式。我们从一个表示书店(原始XML文件)的XML示例之后构建的简单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
    }
  }
}
XPath JSONPath Result
/store/book/author $.store.book[*].author store里所有bookauthor
//author $..author 所有author
/store/* $.store.* store里的所有东西,一些书和一辆红色的自行车。
/store//price $.store..price 商店里所有东西的价格。
//book[3] $..book[2] 第三本书
//book[last()] $..book[(@.length-1)]
$..book[-1:]
最后一本书。
//book[position()<3] $..book[0,1]
$..book[:2]
前两本书
//book[isbn] $..book[?(@.isbn)] 过滤所有isbn号的书籍
好像没有字符串过滤的写法,但可以这么实现:
//查找所有书本的名称包含R的书
var R_BookList=jobject.SelectTokens("$..book[*]")
.Where(p => p["title"].ToString().Contains("R")).ToList();
//book[price<10] $..book[?(@.price<10)] 查找所有价格小于10的书
//* $..* XML文档中的所有元素。JSON结构的所有成员。

转载请说明出处:第六感博客 原文链接:

标签: C# Asp.Net json

相关阅读:

C#使用RSA非对称加密字符串 附Helper帮助类

asp.net WebPage WebMvc 压缩输出html

asp.net 内置委托 Action 和 Func 和 Predicate

vs生成成功但发布时报错 未能将文件...复制到... 未能找到文件...

FluentData 报错 Error:Could not map ...字段名