概述
在.Net开发中,一般操作Json都是使用Newtonsoft.Json包,下面我们来使用该包以类似xpath的方式JsonPath操作Json。
介绍
JsonPath是xpath在json中的应用,是参照xpath表达式来解析xml文档的方式,用一个抽象的名字$来表示最外层的对象。常见的写法
$.store.book[0].title
$['store']['book'][0]['title']
在线测试网站:http://jsonpath.com/
JSONPath 允许使用通配符 * 表示所以的子元素名和数组索引。还允许使用 '..' (从E4X参照过来的和数组切分语法),示例
$.store.book[(@.length-1)].title-- 使用'@'符号表示当前的对象,?(<判断表达式>) 使用逻辑表达式来过滤。
$.store.book[?(@.price < 10)].title
操作对比
XPath | JSONPath | Description |
---|---|---|
/ | $ | 表示根元素 |
. | @ | 当前元素 |
/ | . or [] | 子元素 |
.. | n/a | 父元素 |
// | .. | 递归下降,JSONPath是从E4X借鉴的。 |
* | * | 通配符,表示所有的元素 |
@ | n/a | 属性访问字符 |
[] | [] | 子元素操作符 |
| | [,] | 连接操作符在XPath 结果合并其它结点集合。JSONP允许name或者数组索引。 |
n/a | [start:end:step] | 数组分割操作从ES4借鉴。 |
[] | ?() | 应用过滤表示式 |
n/a | () | 脚本表达式,使用在脚本引擎下面。 |
() | n/a | Xpath分组 |
示例
下面是一个简单的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}}
}
操作示例
var str = File.ReadAllText("aa.txt");
JObject jobj = JObject.Parse(str);var bb = jobj.SelectToken("$.data.emrMenuDisplayModels[2]['identify']");//书点所有书的作者
var autherList = jobj.SelectTokens("$.store.book[*].author");//所有的作者
var autherList2 = jobj.SelectTokens("$...author");//store的所有元素。所有的bookst和bicycle
var store1 = jobj.SelectTokens("$.store.*");//store里面所有东西的price
var store2 = jobj.SelectTokens("$.store..['price']");
var store3 = jobj.SelectTokens("$.store..price");//第三个书
var book1 = jobj.SelectTokens("$.store.book[2]");
var book2 = jobj.SelectTokens("$..book[2]");// 最后一本书
var book3 = jobj.SelectTokens("$..book[-1:]");
//var book3 = jobj.SelectTokens("$..book[(@.len-1)]");//不支持@.length
//var book4 = jobj.SelectTokens("$.store.book[(@.length-1)]");//前面的两本书
var laing = jobj.SelectTokens("$..book[0,1]");//过滤出所有的包含isbn的书
var contain = jobj.SelectTokens("$..book[?(@.isbn)]");//过滤出价格低于10的书。
var price = jobj.SelectTokens("$..book[?(@.price<10)]");//所有元素
var all = jobj.SelectTokens("$..*");
资料
参考资料:https://blog.csdn.net/myself8202/article/details/80724968