JSON全称JavaScript Object Notation(JS对象标记),是一种轻量级的数据交换格式。它相对于XML更小,更易于人阅读和编写,同时也易于机器解释和生存,并有效地提高网络传输效率。
JSON数据的书写格式是:key:value 键/值对。比如:“Name”: “May”
JSON值可以是:
| JSON值类型 | 举例 |
|---|---|
| 数字(整数或浮点数) | “status_code”: 200 |
| 字符串(在双引号中) | “Name”: “Json” |
| 逻辑值(true或false) | “result”: true |
| 数组(在方括号中) | “user”: [“Linda”, “David”, “John”] |
| 对象(在花括号中) | “datas”: {“firstName”: “John”, “lastName”:“Doe”} |
| null | “response”: null |
优点
数据体积小,轻量级的数据交换
程序员编写更加容易
相对于XML,JSON不需要考虑子父节点,更易于机器的解析和生成
JSON支持多种编程语言:Java, JavaScript, PHP, Python, C, C#等
缺点
语法上过于严谨
代码对数据的描述性差
代码不易读
jsonpath为json文档提供了解析能力,通过使用jsonpath,你可以方便的查找节点、获取想要的数据,jsonpath是json版的xpath,正如xpath之于XML文档一样。
python处理json格式所使用的函数
| 函数 | 说明 |
|---|---|
| json.dumps() | 将字典或者列表转换为json格式的字符串 |
| json.loads() | 将json格式字符串转换为python对象 |
| json.dump() | 将字典或者列表转换为json格式的字符串并且写入到文件中 |
| json.load() | 从文件中读取json格式的字符串并且转换为python对象 |
示例:
import json
lst = [
{'name': 'Bob'},
{'name': 'Tina'},
{'name': 'John'},
{'name': 'Daisy'},
{'name': 'Kelly'},
]
# 将字典或者列表转换为json格式的字符串。
json2Str = json.dumps(lst)
print(json2Str)
# 将json格式字符串转换为python对象。
jsonStr2PythonObj = json.loads(json2Str)
print(jsonStr2PythonObj)
# 将字典或者列表转换为json格式的字符串并且写入到文件中。(Data/python_json.txt为已存在的文件路径)
json.dump(lst, open('Data/python_json.txt', 'w', encoding='utf-8'))
# 从文件中读取json格式的字符串并且转换为python对象。
obj = json.load(open('Data/python_json.txt', 'r', encoding='utf-8'))
print(obj)
运行结果如下:

pip install jsonpath
| xpath | jsonpath | 说明 |
|---|---|---|
| / | $ | 根节点 |
| . | @ | 当前节点 |
| / | . or [] | 子节点 |
| … | - | 父节点,jsonpath不支持 |
| // | … | 递归匹配所有子节点 |
| * | * | 通配符,匹配所有元素节点 |
| @ | - | 匹配属性,jsonpath不支持此操作符,因为json是个key-value递归结构,不需要属性访问 |
| [] | [] | 下标运算符,根据索引获取元素,xpath索引从1开始,jsonpath索引从0开始 |
| | | [,] | 连接操作符,将多个结果拼接成数组返回,可以使用索引或别名 |
| - | [start: end:step] | 数组分隔符,xpath不支持 |
| [] | ?() | 过滤表达式 |
| - | () | 脚本表达式,使用在底层脚本引擎下面,xpath不支持 |
| () | - | xpath分组,jsonpath不支持 |
注意:jsonpath的索引从0开始计数。
先创建一个books.json文件:
{
"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
}
}
}
解析books.json文件的:
# jsonpath_demo.py
import json
import jsonpath
# 从Data/books.json文件中读取json格式的字符串并且转换为python对象
obj = json.load(open('Data/books.json', 'r', encoding='utf-8'))
# 获取所有书的作者
authors = jsonpath.jsonpath(obj, '$.store.book[*].author')
print(authors)
# 获取所有的作者
authors= jsonpath.jsonpath(obj, '$..author')
print(authors)
# 获取store的所有元素。所有的book和bicycle
store_elements = jsonpath.jsonpath(obj, '$.store.*')
print(store_elements)
# 获取store里面的所有东西的price
prices = jsonpath.jsonpath(obj, '$.store..price')
# prices = jsonpath.jsonpath(obj, '$..price')
print(prices)
# 获取第三本书的title
book3 = jsonpath.jsonpath(obj, '$..book[2].title')
print(book3)
# 获取最后一本书的title
# book_last = jsonpath.jsonpath(obj, '$..book[(@.length-1)]')
book_last = jsonpath.jsonpath(obj, '$..book[-1:].title')
print(book_last)
# 获取前面的两本书的title
# book_top2 = jsonpath.jsonpath(obj, '$..book[0,1]')
book_top2 = jsonpath.jsonpath(obj, '$..book[:2].title')
print(book_top2)
# 过滤出所有的包含isbn的书
book_isbn = jsonpath.jsonpath(obj, '$..book[?(@.isbn)]')
print(book_isbn)
# 过滤出价格低于10的书的title。
book_priceUnder10 = jsonpath.jsonpath(obj, '$..book[?(@.price<10)].title')
print(book_priceUnder10)
# 获取book节点中category为reference的书的title
book_fiction = jsonpath.jsonpath(obj, '$.store.book[?(@.category=="reference")].title')
print(book_fiction)
# 获取所有元素。
all = jsonpath.jsonpath(obj, '$.*')
print(all)