JsonPath基本用法

JsonPath基本用法

本文主要介紹JsonPath的基本語法,並演示如何在Newtonsoft.Json中進行使用。html

JsonPath的來源

看它的名字你就能知道,這傢伙和JSON文檔有關係,正如XPath之於XML文檔同樣,JsonPath爲Json文檔提供瞭解析能力,經過使用JsonPath,你能夠方便的查找節點、獲取想要的數據,JsonPath是Json版的XPath。node

JsonPath語法

JsonPath的語法相對簡單,它採用開發語言友好的表達式形式,若是你瞭解類C語言,對JsonPath就不會感到不適應。json

JsonPath語法要點:數組

  • $ 表示文檔的根元素
  • @ 表示文檔的當前元素
  • .node_name['node_name'] 匹配下級節點
  • [index] 檢索數組中的元素
  • [start:end:step] 支持數組切片語法
  • * 做爲通配符,匹配全部成員
  • .. 子遞歸通配符,匹配成員的全部子元素
  • (<expr>) 使用表達式
  • ?(<boolean expr>)進行數據篩選

下表將列舉全部支持的語法,並對XPath進行比較:jsonp

XPath JsonPath 說明
/ $ 文檔根元素
. @ 當前元素
/ .[] 匹配下級元素
.. N/A 匹配上級元素,JsonPath不支持此操做符
// .. 遞歸匹配全部子元素
* * 通配符,匹配下級元素
@ N/A 匹配屬性,JsonPath不支持此操做符
[] [] 下標運算符,根據索引獲取元素,XPath索引從1開始,JsonPath索引從0開始
| [,] 鏈接操做符,將多個結果拼接成數組返回,能夠使用索引或別名
N/A [start:end:step] 數據切片操做,XPath不支持
[] ?() 過濾表達式
N/A () 腳本表達式,使用底層腳本引擎,XPath不支持
() N/A 分組,JsonPath不支持

注意:.net

  • JsonPath的索引從0開始計數
  • JsonPath中字符串使用單引號表示,例如:$.store.book[?(@.category=='reference')]中的'reference'

JsonPath示例

下面是相應的JsonPath的示例,代碼來源於https://goessner.net/articles/JsonPath/,JSON文檔以下:code

{
    "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
        }
    }
}

接下來咱們看一下如何對這個文檔進行解析:htm

XPath JsonPath Result
/store/book/author $.store.book[*].author 全部book的author節點
//author $..author 全部author節點
/store/* $.store.* store下的全部節點,book數組和bicycle節點
/store//price $.store..price store下的全部price節點
//book[3] $..book[2] 匹配第3個book節點
//book[last()] $..book[(@.length-1)],或 $..book[-1:] 匹配倒數第1個book節點
//book[position()<3] $..book[0,1],或 $..book[:2] 匹配前兩個book節點
//book[isbn] $..book[?(@.isbn)] 過濾含isbn字段的節點
//book[price<10] $..book[?(@.price<10)] 過濾price<10的節點
//* $..* 遞歸匹配全部子節點

你能夠在http://jsonpath.com/站點進行驗證JsonPath的執行效果。對象

在Newtonsoft.Json中的用法

JsonPath是語言無關的表達式語言,Newtonsoft.Json庫提供了對JsonPath的支持,它提供了JObject.SelectToken()JObject.SelectTokens()方法來使用JsonPath解析Json文檔,代碼以下:遞歸

//建立JObject對象
var jObj = JObject.Parse(jsonString);
var books = jObj.SelectToken("$.store.book[?(@.category=='reference')]");

參考文檔:

相關文章
相關標籤/搜索