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是使用中括号[ ]来定义的,一般定义格式如下所示:- let array=["Surpass","28","Shanghai"];
复制代码 若要对数组取值,则需要使用索引。元素的类型可以是数字、字符串、数组和对象等。
25.1.2.2 对象
对象在JavaScript是使用大括号{ }来定义的,一般定义格式如下所示:- let personInfo={
- name:"Surpass",
- age:28,
- location:"Shanghai"
- }
复制代码 对象一般是基于key和value,在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模块,用法如下所示: json模块中主要包含以下四个操作函数,如下所示:

在json的处理过种中,Python中的原始类型与JSON类型会存在相互转换,具体的转换表如下所示:
PythonJSONdictObjectlistarraytuplearraystrstringintnumberfloatnumberTruetrueFalsefalseNonenull
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 安装
安装方法如下所示:- # 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/
我们以下示例数据为例,来进行对比,如下所示:- { "store":
- {
- "book": [
- { "category": "reference",
- "author": "Nigel Rees",
- "title": "Sayings of the Century",
- "price": 8.95
- },
- { "category": "fiction",
- "author": "Evelyn Waugh",
- "title": "Sword of Honour",
- "price": 12.99
- },
- { "category": "fiction",
- "author": "Herman Melville",
- "title": "Moby Dick",
- "isbn": "0-553-21311-3",
- "price": 8.99
- },
- { "category": "fiction",
- "author": "J. R. R. Tolkien",
- "title": "The Lord of the Rings",
- "isbn": "0-395-19395-8",
- "price": 22.99
- }
- ],
- "bicycle": {
- "color": "red",
- "price": 19.95
- }
- }
- }
复制代码 [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 |