您的位置:

JSONPath:从多个方面深入理解

一、Jsonpath取值

取值是Jsonpath中最基本的操作,它能快速准确地获取需要的数据。Jsonpath取值的基本语法格式如下:

$.[key1,key2,...,keyn]

其中,$表示根节点,在括号中指定需要获取的key,如[key1,key2,...,keyn]。下面是一个示例:

{
  "person": {
    "name": "张三",
    "age": 30,
    "address": {
      "city": "北京",
      "street": "朝阳区"
    },
    "phone": [
      {
        "type": "home",
        "number": "010-xxxx"
      },
      {
        "type": "work",
        "number": "020-xxxx"
      }
    ]
  }
}

取值示例:

$.person.name        // 输出:"张三"
$.person.age         // 输出:30
$.person.address.city // 输出:"北京"
$.person.phone[0].number // 输出: "010-xxxx"

二、怎么下载JSONPath库

要使用Jsonpath,需要引入Jsonpath库。可以通过以下方式安装:

npm install jsonpath

也可以直接下载Jsonpath的js文件,然后在HTML中引用:

<script src="jsonpath.js"></script>

三、JSONPath解析JSON

Jsonpath最常见的应用是解析JSON。Jsonpath提供了一种简洁明了的方式,让我们能够轻松地从JSON中取出需要的数据。下面是一个示例:

{
  "store": {
    "book": [
      {
        "title": "JavaScript权威指南",
        "author": "Flanagan",
        "year": 2006,
        "price": 49.99
      },
      {
        "title": "Java核心技术卷I",
        "author": "Cay Horstmann",
        "year": 2015,
        "price": 59.99
      },
      {
        "title": "Python基础教程",
        "author": "Magnus Lie Hetland",
        "year": 2008,
        "price": 39.95
      }
    ],
    "bicycle": {
      "color": "red",
      "price": 19.95
    }
  }
}

取出所有书籍的作者:

$.store.book[*].author

输出:

[
  "Flanagan",
  "Cay Horstmann",
  "Magnus Lie Hetland"
]

取出所有书籍的价格:

$.store.book[*].price

输出:

[
  49.99,
  59.99,
  39.95
]

四、生成JSONPath

生成Jsonpath有时可以帮助我们更好地理解它的取值规则。下面是一些示例:

// 取出所有书籍的作者
$.store.book[*].author

// 取出第一本书的作者
$.store.book[0].author

// 取出前两本书的作者
$.store.book[:2].author

// 取出最后一本书的作者
$.store.book[-1:].author

// 取出价格大于50的书的作者
$.store.book[?(@.price > 50)].author

五、JSONPath逻辑运算

Jsonpath还支持逻辑运算,如“与”、“或”、“非”等。下面是一些示例:

如果我们要取出所有价格大于50且年份大于2000的书的作者:

$.store.book[?(@.price > 50 && @.year > 2000)].author

如果我们要取出价格大于50或年份大于2000的书的作者:

$.store.book[?(@.price > 50 || @.year > 2000)].author

如果我们要取出价格不等于50的书的作者:

$.store.book[?(@.price != 50)].author

六、JSONPath set

Jsonpath还支持set操作,用于更新JSON数据。set操作的语法格式如下:

$.[key1,key2,...,keyn] = value

其中,$表示根节点,在括号中指定需要更新的key,如[key1,key2,...,keyn]。value是需要更新的值。下面是一个示例:

{
  "person": {
    "name": "张三",
    "age": 30,
    "address": {
      "city": "北京",
      "street": "朝阳区"
    },
    "phone": [
      {
        "type": "home",
        "number": "010-xxxx"
      },
      {
        "type": "work",
        "number": "020-xxxx"
      }
    ]
  }
}

假设我们要将张三的年龄修改为32岁,可以使用如下Jsonpath:

$.person.age = 32

修改后的结果如下:

{
  "person": {
    "name": "张三",
    "age": 32,
    "address": {
      "city": "北京",
      "street": "朝阳区"
    },
    "phone": [
      {
        "type": "home",
        "number": "010-xxxx"
      },
      {
        "type": "work",
        "number": "020-xxxx"
      }
    ]
  }
}

七、怎么导入JSONPath库

在Node.js中,可以通过require的方式导入Jsonpath库,在代码中使用:

const jsonpath = require('jsonpath');

在浏览器中,可以通过script标签引入Jsonpath库,然后使用全局变量JsonPath:

<script src="jsonpath.js"></script>

// 使用全局变量JsonPath
JsonPath.query(data, "$.store.book[*].author");

八、JSON Parse方法选取

除了Jsonpath之外,还有其他选取JSON数据的方法。下面给出一些示例:

方法一:使用JSON.parse方法解析JSON数据,然后使用点号和中括号来取值。

const data = '{"person": {"name": "张三", "age": 30}}';
const obj = JSON.parse(data);
console.log(obj.person.name);  // 输出:"张三"
console.log(obj['person']['age']);  // 输出:30

方法二:使用Lodash库的get方法取值。

const data = '{"person": {"name": "张三", "age": 30}}';
const obj = JSON.parse(data);
console.log(_.get(obj, 'person.name')); // 输出:"张三"

方法三:使用Axios库发起网络请求获取JSON数据,然后使用点号和中括号来取值。

axios.get('/api/data').then(res => {
  console.log(res.data.person.name); // 输出:"张三"
  console.log(res.data['person']['age']); // 输出:30
})