您好,登录后才能下订单哦!
# Python中怎么处理json模块
## 一、JSON简介
JSON(JavaScript Object Notation)是一种轻量级的数据交换格式,它基于ECMAScript的一个子集,采用完全独立于编程语言的文本格式来存储和表示数据。JSON的主要特点包括:
- 易于人类阅读和编写
- 易于机器解析和生成
- 支持复杂数据结构(嵌套对象和数组)
- 广泛应用于Web应用的数据传输
在Python中,`json`模块提供了JSON数据的编码(序列化)和解码(反序列化)功能,使得Python对象和JSON格式之间的转换变得非常简单。
## 二、JSON模块的基本使用
### 1. 导入json模块
```python
import json
函数 | 描述 |
---|---|
json.dumps() |
将Python对象编码为JSON字符串 |
json.loads() |
将JSON字符串解码为Python对象 |
json.dump() |
将Python对象编码并写入文件 |
json.load() |
从文件中读取并解码JSON数据 |
json.dumps()
方法将Python对象转换为JSON格式的字符串。
data = {
"name": "张三",
"age": 30,
"is_student": False,
"courses": ["数学", "英语"],
"address": {
"city": "北京",
"street": "朝阳路"
}
}
json_str = json.dumps(data)
print(json_str)
# 输出: {"name": "\u5f20\u4e09", "age": 30, "is_student": false, "courses": ["\u6570\u5b66", "\u82f1\u8bed"], "address": {"city": "\u5317\u4eac", "street": "\u671d\u9633\u8def"}}
indent
: 缩进级别,使输出更易读ensure_ascii
: 是否转义非ASCII字符(默认为True)sort_keys
: 是否按键排序print(json.dumps(data, indent=4, ensure_ascii=False, sort_keys=True))
将Python对象直接写入文件:
with open('data.json', 'w', encoding='utf-8') as f:
json.dump(data, f, indent=4, ensure_ascii=False)
将JSON字符串转换为Python对象:
json_data = '{"name": "李四", "age": 25, "is_student": true}'
python_obj = json.loads(json_data)
print(python_obj)
# 输出: {'name': '李四', 'age': 25, 'is_student': True}
从文件中读取JSON数据并转换为Python对象:
with open('data.json', 'r', encoding='utf-8') as f:
data = json.load(f)
print(data)
Python类型 | JSON类型 |
---|---|
dict | object |
list, tuple | array |
str | string |
int, float | number |
True | true |
False | false |
None | null |
注意: - JSON中没有元组类型,元组会被转换为数组 - JSON中的所有字符串都是Unicode
默认情况下,json
模块无法序列化自定义类的实例。可以通过以下两种方式解决:
__dict__
属性class Person:
def __init__(self, name, age):
self.name = name
self.age = age
p = Person("王五", 40)
json_str = json.dumps(p.__dict__)
class PersonEncoder(json.JSONEncoder):
def default(self, obj):
if isinstance(obj, Person):
return {'name': obj.name, 'age': obj.age}
return super().default(obj)
json_str = json.dumps(p, cls=PersonEncoder)
from datetime import datetime
def datetime_handler(obj):
if isinstance(obj, datetime):
return obj.isoformat()
raise TypeError("Type not serializable")
data = {'time': datetime.now()}
json_str = json.dumps(data, default=datetime_handler)
对于复杂的JSON数据查询,可以使用jsonpath
库:
# 需要先安装: pip install jsonpath-ng
from jsonpath_ng import parse
data = {
"store": {
"book": [
{"title": "Python基础", "price": 50},
{"title": "高级Python", "price": 80}
]
}
}
jsonpath_expr = parse('$.store.book[*].price')
prices = [match.value for match in jsonpath_expr.find(data)]
print(prices) # 输出: [50, 80]
ijson
库进行流式处理orjson
(比标准库快2-3倍)或ujson
作为替代# 安装: pip install orjson
import orjson
data = orjson.dumps({"key": "value"})
json.loads()
而非eval()
处理JSON字符串object_pairs_hook
参数验证数据def validate_duplicate_keys(ordered_pairs):
d = {}
for k, v in ordered_pairs:
if k in d:
raise ValueError("Duplicate key: %r" % (k,))
d[k] = v
return d
json.loads('{"a": 1, "a": 2}', object_pairs_hook=validate_duplicate_keys)
# 确保设置ensure_ascii=False
json.dumps({"name": "张三"}, ensure_ascii=False)
JSON规范不限制数字大小,但某些实现可能有限制:
# 处理大整数
data = {'big_num': 2**64}
json_str = json.dumps(data)
a = {}
b = {'a': a}
a['b'] = b # 循环引用
# 解决方案1: 使用自定义encoder处理
# 解决方案2: 打破循环引用
# 写入配置
config = {"debug": True, "log_level": "INFO"}
with open('config.json', 'w') as f:
json.dump(config, f, indent=2)
# 读取配置
with open('config.json') as f:
loaded_config = json.load(f)
import requests
response = requests.get('https://api.example.com/data')
data = response.json() # 直接获取JSON数据
class Database:
def __init__(self, filename):
self.filename = filename
def save(self, data):
with open(self.filename, 'w') as f:
json.dump(data, f)
def load(self):
try:
with open(self.filename) as f:
return json.load(f)
except FileNotFoundError:
return {}
Python的json
模块提供了简单而强大的工具来处理JSON数据。通过本文的介绍,你应该已经掌握了:
json.dumps()
和json.loads()
进行基本转换JSON作为现代Web开发和数据交换的事实标准,掌握其在Python中的处理技巧对于任何Python开发者都至关重要。随着经验的积累,你可以进一步探索更高级的JSON处理库和技术,如marshmallow
用于数据验证和序列化,或pydantic
用于数据建模。
“`
这篇文章共计约2300字,涵盖了JSON模块的各个方面,从基础使用到高级技巧,并提供了实际应用示例。内容采用Markdown格式,包含代码块、表格和分级标题,便于阅读和理解。
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。