前言

Github:https://github.com/HealerJean

博客:http://blog.healerjean.com

一、为什么要用 JsonPath

在阅读长长的 JSON 的过程中,最常遇到的需求是想要提取某一个字段的值,或者遍历数组的元素对象值,而这些,都埋在了深深的 JSON 长河中。 为了获取,最先想到的方式是,通过编程来获取想要的字段,假设有如下结构的 ` JSON`:

二、使用 JsonPath

JSON Path 是一种用于在 JSON 数据中定位和提取特定元素的表达式语言,提供了一种简洁的语法,使得从复杂的 JSON 结构中提取数据变得容易。

http://www.e123456.com/aaaphp/online/jsonpath/?

http://www.atoolbox.net/Tool.php?Id=792

https://jsonpath.com/

1、语法说明

语法 说明
$ 根节点,表示 JSON 数据的最外层。
. 子节点操作符,用于访问对象中的属性。
[] 索引操作符,用于访问数组中的元素或通过条件筛选元素。
* 通配符,用于匹配任意属性名或数组索引。
.. 递归下降符号,用于搜索嵌套结构中的所有层级
@ 当前节点,可以用于在筛选条件中引用当前节点。

2、样例

{
  "human": {
    "person": {
      "man": [
        {
          "name": "Jack",
          "age": "17"
        },
        {
          "name": "Mike",
          "age": "32"
        },
        {
          "name": "John",
          "age": "23"
        },
        {
          "name": "David",
          "age": "41"
        },
        {
          "name": "Eric",
          "age": "29"
        },
        {
          "name": "Chris",
          "age": "38"
        },
        {
          "name": "Tom",
          "age": "27"
        },
        {
          "name": "Peter",
          "age": "35"
        },
        {
          "name": "Robert",
          "age": "26"
        },
        {
          "name": "Daniel",
          "age": "33"
        }
      ]
    }
  }
}

1)获取某个字段

$.human.person

image-20230612102326760

2)获取所有值

$.human..name

image-20230612102430705

3)获取数组中某几个

a、某几个

$.human.person.man[0,1,2]

image-20230612102710275

b、某个区间

$.human.person.man[0:2]

image-20230612102841088

c、某几个个属性

$.human.person.man.[name,age]

image-20230613152221214

4)条件判断

()表达式,用于进行条件判断或进行逻辑操作。可以在括号内使用比较运算符(如 >, <, == 等)和逻辑运算符(如 &&, ||)来定义条件。例如,(@.length) 表示获取数组中的最后一个元素。

@ 表示当前元素,.length 表示当前元素的长度,(@.length-1) 就能够表示获取数组最后一个元素。)

?()过滤表达式。在 ?() 中,可以使用任意合法的 JavaScript 表达式来对元素进行筛选。这样的表达式在过滤器内部被计算,并根据其结果决定是否选择或排除当前元素。例如,[?(@.age > 25)] 表示根据元素的 “age” 属性筛选出年龄大于 25 的元素。

样例1:

$..man[(@.length-10)]

image-20230612103242073

样例2:

$..man[?(@.age>30)]

image-20230612103452730

样例3:

$.human.person.man.[?(@.name='Jack')]

image-20230613152420562

ContactAuthor