您的位置:首页 > 汽车 > 时评 > Python json操作

Python json操作

2024/9/8 10:29:34 来源:https://blog.csdn.net/a1053765496/article/details/140690709  浏览:    关键词:Python json操作

对象转成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 数组中的所有元素。
`[]`
  • 使用方括号可以访问数组中的特定元素。例如,$.store.book[0] 表示访问 book 数组中的第一个元素。
  • 也可以使用切片访问数组元素。例如,$.store.book[:2] 表示访问 book 数组中的前两个元素。
`?()`
  • 使用 ?() 可以进行条件过滤。例如,$.store.book[?(@.price < 15)] 表示过滤出价格小于 15 的书籍。
  • 过滤条件可以包括逻辑运算符,如 &&(与)和 ||(或),以及比较运算符,如 ==(等于)、!=(不等于)、<(小于)、>(大于)。
`@`表示当前节点。例如,$..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]

 

 

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com