NPM-jsonpath示例和基础命令

jsonpath 是一个json操作的第三方库,有了他,就可以方面的操作json,无论在服务器端还是在浏览器端。深度节点进行检索和更新json内部的内容。符合元数据的思想。

jsonpath

使用JSONPath表达式查询JavaScript对象。Node.js的健壮/安全JSONPath引擎

1
2
3
4
5
6
7
8
9
var cities = [
  { name"London""population"8615246 },
  { name"Berlin""population"3517424 },
  { name"Madrid""population"3165235 },
  { name"Rome",   "population"2870528 }
];
var jp = require('jsonpath');
var names = jp.query(cities, '$..name');
// [ "London", "Berlin", "Madrid", "Rome" ]

安装

从npm安装:

1
$ npm install jsonpath

JSONPath语法

以下是根据Stefan Goessner在2007年介绍JSONPath 的原始帖子改编的语法和示例。

JSONPath

描述

$

根对象/元素

@

当前对象/元素

.

儿童会员运营商

..

递归后代运算符; JSONPath借用了E4X的这种语法

*

通配符匹配所有对象/元素,无论其名称如何

[]

下标运营商

[,]

用于替代名称或数组索引的联合运算符作为集合

[start:end:step]

从ES4 / Python借来的数组切片运算符

?()

通过静态评估应用过滤器(脚本)表达式

()

通过静态评估来编写脚本

给定此示例数据集,请参阅下面的示例表达式:  

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
{
"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
}
}
}

示例JSONPath表达式:

JSONPath

描述

$.store.book[*].author

商店里所有书籍的作者

$..author

所有作者

$.store.*

商店里的所有东西,都是一些书和一辆红色的自行车

$.store..price

商店里一切的价格

$..book[2]

第三本书

$..book[(@.length-1)]

最后一本书通过脚本下标

$..book[-1:]

通过切片的最后一本书

$..book[0,1]

前两本书通过下标联合

$..book[:2]

前两本书通过下标数组切片

$..book[?(@.isbn)]

使用isbn number过滤所有书籍

$..book[?(@.price<10)]

过滤所有比10便宜的书籍

$..book[?(@.price==8.95)]

过滤所有费用为8.95的书籍

$..book[?(@.price<30 && @.category=="fiction")]

过滤所有低于30的小说书籍

$..*

JSON结构的所有成员

方法

jp.query(obj,pathExpression [,count])

obj匹配中查找元素pathExpression。返回满足提供的JSONPath表达式的元素数组,如果没有匹配则返回空数组。count如果指定,仅返回第一个元素。

var authors = jp.query(data, ‘$..author’);
// [ ‘Nigel Rees’, ‘Evelyn Waugh’, ‘Herman Melville’, ‘J. R. R. Tolkien’ ]

jp.paths(obj,pathExpression [,count])

obj匹配中查找元素的路径pathExpression。返回满足提供的JSONPath表达式的元素路径数组。每个路径本身是一个键数组,表示obj匹配元素内的位置。count如果指定,仅返回第一个路径。

1
2
3
4
5
6
7
var paths = jp.paths(data, '$..author');
// [
// ['$', 'store', 'book', 0, 'author'] },
// ['$', 'store', 'book', 1, 'author'] },
// ['$', 'store', 'book', 2, 'author'] },
// ['$', 'store', 'book', 3, 'author'] }
// ]

jp.nodes(obj,pathExpression [,count])

obj匹配中查找元素及其对应的路径pathExpression。返回一个节点对象数组,其中每个节点都path包含一个键数组,表示其中的位置obj,并value指向匹配的元素。count如果指定,仅返回第一个节点。

1
2
3
4
5
6
7
var nodes = jp.nodes(data, '$..author');
// [
// { path: ['$', 'store', 'book', 0, 'author'], value: 'Nigel Rees' },
// { path: ['$', 'store', 'book', 1, 'author'], value: 'Evelyn Waugh' },
// { path: ['$', 'store', 'book', 2, 'author'], value: 'Herman Melville' },
// { path: ['$', 'store', 'book', 3, 'author'], value: 'J. R. R. Tolkien' }
// ]

jp.value(obj,pathExpression [,newValue])

返回第一个匹配元素的值pathExpression。如果newValue提供,则设置第一个匹配元素的值并返回新值。

jp.parent(obj,pathExpression)

返回第一个匹配元素的父级。

jp.apply(obj,pathExpression,fn)

fn在每个匹配元素上运行提供的函数,并使用函数的返回值替换每个匹配元素。该函数接受匹配元素的值作为其唯一参数。返回匹配节点及其更新值。

1
2
3
4
5
6
7
var nodes = jp.apply(data, '$..author', function(value) { return value.toUpperCase() });
// [
// { path: ['$', 'store', 'book', 0, 'author'], value: 'NIGEL REES' },
// { path: ['$', 'store', 'book', 1, 'author'], value: 'EVELYN WAUGH' },
// { path: ['$', 'store', 'book', 2, 'author'], value: 'HERMAN MELVILLE' },
// { path: ['$', 'store', 'book', 3, 'author'], value: 'J. R. R. TOLKIEN' }
// ]

jp.parse(pathExpression)

将提供的JSONPath表达式解析为路径组件及其关联的操作。

1
2
3
4
5
var path = jp.parse('$..author');
// [
// { expression: { type: 'root', value: '$' } },
// { expression: { type: 'identifier', value: 'author' }, operation: 'member', scope: 'descendant' }
// ]

jp.stringify(路径)

给定路径,以字符串形式返回路径表达式。所提供的路径可以是jp.nodes例如由例如返回的平面数组的键,或者可替代地是以返回的路径组件阵列的形式的完全解析的路径表达式jp.parse

1
2
var pathExpression = jp.stringify(['$', 'store', 'book', 0, 'author']);
// "$.store.book[0].author"
  • 版权声明: 本博客所有文章,未经许可,任何单位及个人不得做营利性使用!转载请标明出处!如有侵权请联系作者。
  • Copyrights © 2015-2023 翟天野

请我喝杯咖啡吧~