Python基础-25 JSONPath用法

打印 上一主题 下一主题

主题 1012|帖子 1012|积分 3036

25 使用Python处理JSON数据

25.1 JSON简介

25.1.1 什么是JSON

    JSON全称为JavaScript Object Notation,一般翻译为JS标记,是一种轻量级的数据交换格式。是基于ECMAScript的一个子集,采用完全独立于编程语言的文本格式来存储和表示数据。简洁和清晰的层次结构使得JSON成为理想的数据交换语言,其主要特点有:易于阅读易于机器生成有效提升网络速度等。
25.1.2 JSON的两种结构

    JSON简单来说,可以理解为JavaScript中的数组对象,通过这两种结构,可以表示各种复杂的结构。
25.1.2.1 数组

    数组在JavaScript是使用中括号[ ]来定义的,一般定义格式如下所示:
  1. let array=["Surpass","28","Shanghai"];
复制代码
    若要对数组取值,则需要使用索引。元素的类型可以是数字字符串数组对象等。
25.1.2.2 对象

    对象在JavaScript是使用大括号{ }来定义的,一般定义格式如下所示:
  1. let personInfo={
  2.   name:"Surpass",
  3.   age:28,
  4.   location:"Shanghai"
  5. }
复制代码
    对象一般是基于keyvalue,在JavaScript中,其取值方式也非常简单variable.key即可。元素value的类型可以是数字字符串数组对象等。
25.1.3 支持的数据格式

    JSON支持的主要数据格式如下所示:

  • 数组:使用中括号
  • 对象:使用大括号
  • 整型浮点型布尔类型null
  • 字符串类型:必须使用双引号,不能使用单引号
    多个数据之间使用逗号做为分隔符,基与Python中的数据类型对应表如下所示:
JSONPythonObjectdictarrayliststringstrnumber(int)intnumber(real)floattrueTruefalseFalsenullNone25.2 Python对JSON的支持

25.2.1 Python 和 JSON 数据类型

    在Python中主要使用json模块来对JSON数据进行处理。在使用前,需要导入json模块,用法如下所示:
  1. import json
复制代码
    json模块中主要包含以下四个操作函数,如下所示:

    在json的处理过种中,Python中的原始类型与JSON类型会存在相互转换,具体的转换表如下所示:

  • Python 转换为 JSON
PythonJSONdictObjectlistarraytuplearraystrstringintnumberfloatnumberTruetrueFalsefalseNonenull

  • JSON 转换为 Python
JSONPythonObjectdictarrayliststringstrnumber(int)intnumber(real)floattrueTruefalseFalsenullNone25.2.2 json模块常用方法

    关于Python 内置的json模块,可以查看之前我写的文章:https://www.cnblogs.com/surpassme/p/13034972.html
25.3 使用JSONPath处理JSON数据

    内置的json模块,在处理简单的JSON数据时,易用且非常非常方便,但在处理比较复杂且特别大的JSON数据,还是有一些费力,今天我们使用一个第三方的工具来处理JSON数据,叫JSONPath
25.3.1 什么是JSONPath

    JSONPath是一种用于解析JSON数据的表达语言。经常用于解析和处理多层嵌套的JSON数据,其用法与解析XML数据的XPath表达式语言非常相似。
25.3.2 安装

    安装方法如下所示:
  1. # pip install -U jsonpath
复制代码
25.3.3 JSONPath语法

    JSONPath语法与XPath非常相似,其对应参照表如下所示:
XPathJSONPath描述/$根节点/元素.@当前节点/元素/. or []子元素..n/a父元素//..递归向下搜索子元素**通配符,表示所有元素@n/a访问属性,JSON结构的数据没有这种属性[][]子元素操作符(可以在里面做简单的迭代操作,如数据索引,根据内容选值等)|[,]支持迭代器中做多选n/a[start :end :step]数组分割操作[]?()筛选表达式n/a()支持表达式计算()n/a分组,JSONPath不支持
以上内容可查阅官方文档:https://goessner.net/articles/JsonPath/
    我们以下示例数据为例,来进行对比,如下所示:
  1. { "store":
  2.   {
  3.     "book": [
  4.       { "category": "reference",
  5.         "author": "Nigel Rees",
  6.         "title": "Sayings of the Century",
  7.         "price": 8.95
  8.       },
  9.       { "category": "fiction",
  10.         "author": "Evelyn Waugh",
  11.         "title": "Sword of Honour",
  12.         "price": 12.99
  13.       },
  14.       { "category": "fiction",
  15.         "author": "Herman Melville",
  16.         "title": "Moby Dick",
  17.         "isbn": "0-553-21311-3",
  18.         "price": 8.99
  19.       },
  20.       { "category": "fiction",
  21.         "author": "J. R. R. Tolkien",
  22.         "title": "The Lord of the Rings",
  23.         "isbn": "0-395-19395-8",
  24.         "price": 22.99
  25.       }
  26.     ],
  27.     "bicycle": {
  28.       "color": "red",
  29.       "price": 19.95
  30.     }
  31.   }
  32. }
复制代码
[table][tr]XPathJSONPath结果[/tr][tr][td]/store/book/author[/td][td]$.store.book
  • .author[/td][td]获取book节点中所有author[/td][/tr][tr][td]//author[/td][td]$..author[/td][td]获取所有author[/td][/tr][tr][td]/store/*[/td][td]$.store.*[/td][td]获取store的元素,包含book和bicycle[/td][/tr][tr][td]/store//price[/td][td]$.store..price[/td][td]获取store中的所有price[/td][/tr][tr][td]//book[3][/td][td]$..book[2][/td][td]获取第三本书所有信息[/td][/tr][tr][td]//book[last()][/td][td]$..book[(@.length-1)]
    $..book[-1:][/td][td]获取最后一本书的信息[/td][/tr][tr][td]//book[position()❤️][/td][td]$..book[0,1]
    $..book[:2][/td][td]获取前面的两本书[/td][/tr][tr][td]//book[isbn][/td][td]$..book[?(@.isbn)][/td][td]根据isbn进行过滤[/td][/tr][tr][td]//book[price
  • 本帖子中包含更多资源

    您需要 登录 才可以下载或查看,没有账号?立即注册

    x
    回复

    使用道具 举报

    0 个回复

    倒序浏览

    快速回复

    您需要登录后才可以回帖 登录 or 立即注册

    本版积分规则

    干翻全岛蛙蛙

    论坛元老
    这个人很懒什么都没写!
    快速回复 返回顶部 返回列表