对象转成JSON字符串
- json.dumps()
import json# python对象
data = {"name": "Tom","age": 18,"gender": "男"
}# 转成json字符串
print(json.dumps(data)) # {"name": "Tom", "age": 18, "gender": "\u7537"}
print(json.dumps(data, ensure_ascii=False)) # {"name": "Tom", "age": 18, "gender": "男"}# 参数说明
# ensure_ascii=False:默认情况下 json.dump()会将所有非ASCII字符转义。如果设置ensure_ascii=False,则不会转义非ASCII字符,这样可以确保文件中保存的是原始字符。
JSON字符串转成对象
- json.loads()
import json# Json字符串
json_string = '{"name": "Tom","age": 18,"gender": "男"}'# 转成python对象
obj = json.loads(json_string)
print(obj) # {'name': 'Tom', 'age': 18, 'gender': '男'}
print(type(obj)) # <class 'dict'>
对象保存为json文件
import json# python对象
data = {"name": "Tom","age": 18,"gender": "男"
}# 保存为JSON文件,指定编码格式
with open('data.json', 'w', encoding='utf-8') as file:json.dump(data, file, ensure_ascii=False, indent=4)# 参数说明
# encoding='utf-8': 通过open函数的encoding参数指定文件的编码为UTF-8。
# ensure_ascii=False: 默认情况下 json.dump()会将所有非ASCII字符转义。如果设置ensure_ascii=False,则不会转义非ASCII字符,这样可以确保文件中保存的是原始字符。
# indent=4: 这个参数用于格式化输出,使JSON文件更具可读性。
从JSON文件中读取数据
import json# 从JSON文件中读取数据
with open('data.json', 'r', encoding='utf-8') as file:data = json.load(file)print(data) # {'name': 'Tom', 'age': 18, 'gender': '男'}# 参数说明
# encoding='utf-8': 通过open函数的encoding参数指定文件的编码为UTF-8。
JSONPath的使用
JSON数据示例
{"store": {"book": [{ "category": "fiction", "author": "南派三叔", "title": "盗墓笔记", "price": 10 },{ "category": "non-fiction", "author": "William Shakespeare", "title": "Romeo and Juliet", "price": 15 }],"bicycle": { "color": "red", "price": 19.95 }}
}
JSONPath表达式语法
语法 | 说明 |
---|---|
`$` | 表示 JSON 数据的根节点。例如,$.store 表示访问根节点下的 store 属性。 |
`.` | 用于访问子节点。例如,$.store.book 表示访问 store 节点下的 book 属性。 |
`..` | 用于递归地搜索所有子节点。例如,$..author 表示搜索所有 author 属性,不管它们位于 JSON 结构的哪个层级。 |
`*` | 表示匹配所有元素。例如,$.store.book[*] 表示访问 book 数组中的所有元素。 |
`[]` |
|
`?()` |
|
`@` | 表示当前节点。例如,$..book[?(@.author == 'Author 1')] 表示查找所有作者为 "Author 1" 的书籍。 |
安装JSONPath
pip install jsonpath
pip install jsonpath_ng.ext
示例:
from jsonpath import jsonpathdata = {"store": {"book": [{"category": "fiction", "author": "南派三叔", "title": "盗墓笔记", "price": 10},{"category": "non-fiction", "author": "William Shakespeare", "title": "Romeo and Juliet", "price": 15}],"bicycle": {"color": "red", "price": 19.95}}
}# 示例一:获取所有书籍的作者
author = jsonpath(data, '$.store.book[*].author')
print(author) # ['南派三叔', 'William Shakespeare']# 示例二:获取所有价格小于 15 的书籍的作者
author = jsonpath(data, '$.store.book[?(@.price < 15)].author')
print(author) # ['南派三叔']# 示例三:获取所有价格
price = jsonpath(data, '$..price')
print(price) # [10, 15, 19.95]# 示例四:提取store对象下的所有对象
attribute = jsonpath(data, '$.store.*')
print(attribute) # [[{'category': 'fiction', 'author': '南派三叔', 'title': '盗墓笔记', 'price': 10}, {'category': 'non-fiction', 'author': 'William Shakespeare', 'title': 'Romeo and Juliet', 'price': 15}], {'color': 'red', 'price': 19.95}]# 示例五:多条件过滤,价格小于15 类型为小说的
multiple = jsonpath(data, "$.store.book[?(@.price < 15 && @.category == 'fiction')]")
print(multiple) # [{'category': 'fiction', 'author': '南派三叔', 'title': '盗墓笔记', 'price': 10}]
from jsonpath_ng.ext import parsedata = {"store": {"book": [{"category": "fiction", "author": "南派三叔", "title": "盗墓笔记", "price": 10},{"category": "non-fiction", "author": "William Shakespeare", "title": "Romeo and Juliet", "price": 15}],"bicycle": {"color": "red", "price": 19.95}}
}# 键值对遍历
kv = parse("$.store.book[*].['title', 'price']")v = [match.value for match in kv.find(data)]
print(v) # ['盗墓笔记', 10, 'Romeo and Juliet', 15]