本文由 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前,先理解下xPathxPathXML的门路语言,应用门路标识符通过层级构造定位文档元素,例如在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/