本文由 Deguang 发表于 码路-技术博客
在前端开发中,当接口返回一个简单的嵌套JSON时,获取其中某个固定层级的数据,须要应用链式取值
// 接口数据var obj = { name: "历史书", value: 3, children: [ { name: "明清", value: "3-1", count: 10 }, { name: "近代", value: "3-2", count: 20 } ]}// 获取第二个子类型的valueconst val = obj.children[1].value // 3-2
当层级构造再次变长,应用链式取值代码简短,且容易出错如,若这里的数据层级呈现问题,比方children
长度仅为1,就会遇到咱们常见的报错:Uncaught TypeError: Cannot read property 'value' of undefined
。
为了防止报错导致问题,这里就能够应用 JSONPath
来进行取值。
JSONPath
在意识JSONPath
前,先理解下xPath
。xPath
是XML
的门路语言,应用门路标识符通过层级构造定位文档元素,例如在HTML 中定位元素:
相似的,JSONPath
是通过门路检索JSON,反对操作符、函数、过滤器等用法,不便疾速定位,下面的value获取,能够用JSONPath 形容为JSONPath('$.children[1].value', obj)
操作符
符号 | 形容 |
---|---|
$ | 查问的根节点对象,用于示意一个ison数据,能够是数组或对象 |
@ | 过滤器断言 (filter predicate) 解决的以后节点对象,相似于iava中的this字段 |
* | 通配符,示意一个名字或数字 |
* | 递归搜寻 |
.<name> | 子节点 |
['<name>'(,'<name>') | 一个或多个子节点 |
<number> (, <number>)] | 一个或多个数组下标 |
[start:end] | 数组片段,区间为[start.end),不蕴含end |
[?(<expression>)] | 过滤器表达式,表达式后果必须是boolean |
函数
函数能够在门路的尾部调用,函数的输入是门路表达式的输入
符号 | 形容 | 输入 |
---|---|---|
min() | 获取数值类型数组的最小值 | Double |
max() | 获取数值类型数组的最大值 | Double |
avg() | 获取数值类型数组的平均值 | Double |
stddev() | 获取数值类型数组的标准差 | Double |
length() | 获取数值类型数组的长度 | Integer |
过滤器
过滤器是用于筛选数组的逻辑表达式。
操作符 | 形容 |
---|---|
== | 等于,但数字1不等于字符1 |
!= | 不等于 |
< | 小于 |
<= | 小于等于 |
> | 大于 |
>= | 大于等于 |
=~ | 判断是否合乎正则表达式,例如[?(@.value =~ foo.*?/i)] |
in | 所属符号,例如[?(@.size in [s,M)] |
nin | 排除 |
size | 长度 |
empty | 判空 |
参考:
https://goessner.net/articles/JsonPath/