什么是JSONPath

在XML中,有像XPath这样的工具来分析、转换和选择性的提取XML节点。那么,JSONPath便是JSON的查询语言,功能类似于XML中的XPath,你可以用它方便的提取和设置指定JSON字段。

JSONPath 语法

JSONPath表达式指定了JSON结构中一个或一组元素的路径。路径可以使用点表示法或中括号表示法。例如 XPath 的写法是/store/book[1]/title,对应JSONPath写法便是:$.store.book[0].title$.['store']['book'][0]['title'],其中的$表示根对象。

表达式 描述
$ 根对象或数组
.property 选择父对象中的指定属性
['property'] 选择父对象中的指定属性,如果属性名包含特殊字符或者不是以A..Za..z_开头,请给属性名加上单引号
[n] 从数组中选择第n个元素,索引从0开始
[index1,index2,…] 选择指定索引的数组,返回一个列表
..property 递归搜索属性名,并返回属性值列表;只找到一个属性,也返回一个列表
* 通配符选择对象或数组中的所有元素。例如,address.*表示返回地址下的所有元素
[start:end] 返回索引开始到索引结束的所有元素
[start:] 返回索引开始到结束位置的元素列表
[:n] 选择数组的前n个元素,返回一个列表
[-n:] 选择数组的最后n个元素,返回一个列表
[?(expression)] 选择对象或数组中与指定过滤器匹配的所有元素,返回一个列表
[(expression)] 使用脚本表达式代替显式属性名称或索引
@ 在过滤器表达式中用于引用当前节点

JSONPath 实例

{
    "school": {
        "name": "北京航空航天大学",
        "major": [
            {
                "name": "软件工程",
                "number": 301
            },
            {
                "name": "食品与科学",
                "number": 302
            },
            {
                "name": "计算机信息工程",
                "rank": 1,
                "number": 303
            },
            {
                "name": "土木工程",
                "rank": 2,
                "number": 304
            }
        ],
        "location": {
            "address": "北京市海淀区学院路37号",
            "lng": 116.34084820747375,
            "lat": 39.979241217295936
        }
    },
    "rank": 12
}

以学校下的专业JSON数据结构为例,JSONPath 路径对应的结果如下:

JSONPath 结果
$.school.major[*].name 获取school下major下的所有name值
$..name 获取所有name的值
$.school.* 获取school下的所有元素
$.school..number 获取school下所有number的值
$..major[2] 获取major数组的第3个值
$..major[-2] 倒数的第二个专业
$..major[0,1] 前两个专业
$..major[:2] 从索引0(包含)到索引2(不包含)的所有专业
$..major[1:2] 从索引1(包含)到索引2(不包含)的所有专业
$..major[-2:] 获取major数组的最后两个值
$..major[2:] 获取major数组的第3个到最后一个的区间值
$..major[?(@.rank)] 获取major数组中包含rank的所有值
$.school.major[?(@.number < 10)] 获取major数组中number<10的所有值
$..major[?(@.number <= $['rank'])] 获取major数组中number<=rank的所有值
$..major[?(@.name =~ /.*工程/i)] 获取major数组中的专业名字以“工程”结尾的所有值
$..* 逐层列出的所有值,层级由外到内
$..major.length() 获取major数组的长度

JSONPath 支持库

JSONPath支持的语言非常丰富,其底层实现也很简单,下面的语言都有自己的开源库:

语言
JavaScript s3u/JSONPath
Python kennknowles/python-jsonpath-rw
Java json-path/JsonPathfastjson 1.2.0+
Node dchester/jsonpath
PHP FlowCommunications/JSONPath
Ruby joshbuddy/jsonpath
Go oliveagle/jsonpath