json相关内容(python)
JSON(JavaScript Object Notation)是一种轻量级的数据交换格式,易于人阅读和编写,也易于机器解析和生成。Python 提供了 json
模块来处理 JSON 数据。以下是关于 Python 中 JSON 的详细内容:
1. 导入 json
模块
import json
2. 将 Python 对象转换为 JSON 字符串
使用 json.dumps()
函数可以将 Python 对象(如字典、列表、字符串、数字等)转换为 JSON 格式的字符串。
data = {
"name": "Alice",
"age": 30,
"is_student": False,
"courses": ["Math", "Science"]
}
json_string = json.dumps(data)
print(json_string)
输出:
{"name": "Alice", "age": 30, "is_student": false, "courses": ["Math", "Science"]}
3. 将 JSON 字符串转换为 Python 对象
使用 json.loads()
函数可以将 JSON 格式的字符串转换为 Python 对象。
json_string = '{"name": "Alice", "age": 30, "is_student": false, "courses": ["Math", "Science"]}'
data = json.loads(json_string)
print(data)
输出:
{'name': 'Alice', 'age': 30, 'is_student': False, 'courses': ['Math', 'Science']}
4. 将 Python 对象写入 JSON 文件
使用 json.dump()
函数可以将 Python 对象写入 JSON 文件。
data = {
"name": "Alice",
"age": 30,
"is_student": False,
"courses": ["Math", "Science"]
}
with open('data.json', 'w') as f:
json.dump(data, f)
5. 从 JSON 文件读取 Python 对象
使用 json.load()
函数可以从 JSON 文件中读取数据并转换为 Python 对象。
with open('data.json', 'r') as f:
data = json.load(f)
print(data)
6. 处理复杂数据类型
JSON 支持的数据类型有限,Python 中的一些数据类型(如 datetime
对象)无法直接序列化为 JSON。可以通过自定义编码器和解码器来处理这些复杂数据类型。
自定义编码器
import json
from datetime import datetime
class CustomEncoder(json.JSONEncoder):
def default(self, obj):
if isinstance(obj, datetime):
return obj.isoformat()
return super().default(obj)
data = {
"name": "Alice",
"age": 30,
"created_at": datetime.now()
}
json_string = json.dumps(data, cls=CustomEncoder)
print(json_string)
自定义解码器
import json
from datetime import datetime
def custom_decoder(dct):
if 'created_at' in dct:
dct['created_at'] = datetime.fromisoformat(dct['created_at'])
return dct
json_string = '{"name": "Alice", "age": 30, "created_at": "2023-10-01T12:34:56.789012"}'
data = json.loads(json_string, object_hook=custom_decoder)
print(data)
7. 格式化输出
json.dumps()
和 json.dump()
函数提供了多个参数来控制输出的格式,如缩进、排序等。
data = {
"name": "Alice",
"age": 30,
"is_student": False,
"courses": ["Math", "Science"]
}
json_string = json.dumps(data, indent=4, sort_keys=True)
print(json_string)
输出:
{
"age": 30,
"courses": [
"Math",
"Science"
],
"is_student": false,
"name": "Alice"
}
8. 处理 JSON 中的特殊字符
JSON 字符串中的特殊字符(如双引号、反斜杠等)会被自动转义。
data = {
"message": "He said, \"Hello!\""
}
json_string = json.dumps(data)
print(json_string)
输出:
{"message": "He said, \"Hello!\""}
9. 处理 JSON 中的 None
在 JSON 中,None
会被转换为 null
。
data = {
"name": "Alice",
"age": None
}
json_string = json.dumps(data)
print(json_string)
输出:
{"name": "Alice", "age": null}
10. 处理 JSON 中的 NaN
和 Infinity
JSON 标准不支持 NaN
和 Infinity
,但 Python 的 json
模块提供了 allow_nan
参数来处理这些特殊情况。
import math
data = {
"value": float('nan')
}
json_string = json.dumps(data, allow_nan=True)
print(json_string)
输出:
{"value": NaN}
11. 处理 JSON 中的编码问题
默认情况下,json.dumps()
输出的字符串是 ASCII 编码的。可以通过 ensure_ascii=False
参数来保留非 ASCII 字符。
data = {
"name": "张三"
}
json_string = json.dumps(data, ensure_ascii=False)
print(json_string)
输出:
{"name": "张三"}
12. 处理 JSON 中的循环引用
如果 Python 对象中存在循环引用,json.dumps()
会抛出 TypeError
。可以通过自定义编码器来处理循环引用。
import json
class CustomEncoder(json.JSONEncoder):
def default(self, obj):
if isinstance(obj, set):
return list(obj)
return super().default(obj)
data = {
"name": "Alice",
"friends": set(["Bob", "Charlie"])
}
json_string = json.dumps(data, cls=CustomEncoder)
print(json_string)
13. 处理 JSON 中的自定义对象
可以通过自定义编码器将自定义对象序列化为 JSON。
import json
class Person:
def __init__(self, name, age):
self.name = name
self.age = age
class CustomEncoder(json.JSONEncoder):
def default(self, obj):
if isinstance(obj, Person):
return {"name": obj.name, "age": obj.age}
return super().default(obj)
person = Person("Alice", 30)
json_string = json.dumps(person, cls=CustomEncoder)
print(json_string)
输出:
{"name": "Alice", "age": 30}
14. 处理 JSON 中的大整数
JSON 标准中的数字类型是双精度浮点数,因此大整数可能会丢失精度。可以通过将大整数转换为字符串来避免这个问题。
data = {
"big_number": 12345678901234567890
}
json_string = json.dumps(data, default=str)
print(json_string)
输出:
{"big_number": "12345678901234567890"}
15. 处理 JSON 中的二进制数据
JSON 不支持二进制数据,但可以通过将二进制数据编码为 Base64 字符串来处理。
import json
import base64
data = {
"binary_data": base64.b64encode(b"hello").decode('utf-8')
}
json_string = json.dumps(data)
print(json_string)
输出:
{"binary_data": "aGVsbG8="}
16. 处理 JSON 中的嵌套对象
JSON 支持嵌套对象和数组,Python 中的字典和列表可以很好地映射到 JSON 对象和数组。
data = {
"name": "Alice",
"address": {
"street": "123 Main St",
"city": "Wonderland"
},
"phone_numbers": ["123-456-7890", "987-654-3210"]
}
json_string = json.dumps(data, indent=4)
print(json_string)
输出:
{
"name": "Alice",
"address": {
"street": "123 Main St",
"city": "Wonderland"
},
"phone_numbers": [
"123-456-7890",
"987-654-3210"
]
}
17. 处理 JSON 中的空值
JSON 中的空值用 null
表示,Python 中的 None
会被转换为 null
。
data = {
"name": "Alice",
"age": None
}
json_string = json.dumps(data)
print(json_string)
输出:
{"name": "Alice", "age": null}
18. 处理 JSON 中的布尔值
JSON 中的布尔值用 true
和 false
表示,Python 中的 True
和 False
会被转换为 true
和 false
。
data = {
"is_student": True,
"is_employed": False
}
json_string = json.dumps(data)
print(json_string)
输出:
{"is_student": true, "is_employed": false}
19. 处理 JSON 中的数组
JSON 中的数组用 []
表示,Python 中的列表会被转换为 JSON 数组。
data = {
"courses": ["Math", "Science", "History"]
}
json_string = json.dumps(data)
print(json_string)
输出:
{"courses": ["Math", "Science", "History"]}
20. 处理 JSON 中的对象
JSON 中的对象用 {}
表示,Python 中的字典会被转换为 JSON 对象。
data = {
"name": "Alice",
"age": 30
}
json_string = json.dumps(data)
print(json_string)
输出:
{"name": "Alice", "age": 30}
21. 处理 JSON 中的字符串
JSON 中的字符串用双引号 "
表示,Python 中的字符串会被转换为 JSON 字符串。
data = {
"message": "Hello, World!"
}
json_string = json.dumps(data)
print(json_string)
输出:
{"message": "Hello, World!"}
22. 处理 JSON 中的数字
JSON 中的数字可以是整数或浮点数,Python 中的整数和浮点数会被转换为 JSON 数字。
data = {
"age": 30,
"height": 5.9
}
json_string = json.dumps(data)
print(json_string)
输出:
{"age": 30, "height": 5.9}
23. 处理 JSON 中的 null
JSON 中的 null
表示空值,Python 中的 None
会被转换为 null
。
data = {
"name": "Alice",
"age": None
}
json_string = json.dumps(data)
print(json_string)
输出:
{"name": "Alice", "age": null}
24. 处理 JSON 中的 true
和 false
JSON 中的 true
和 false
表示布尔值,Python 中的 True
和 False
会被转换为 true
和 false
。
data = {
"is_student": True,
"is_employed": False
}
json_string = json.dumps(data)
print(json_string)
输出:
{"is_student": true, "is_employed": false}
25. 处理 JSON 中的 Infinity
和 NaN
JSON 标准不支持 Infinity
和 NaN
,但 Python 的 json
模块提供了 allow_nan
参数来处理这些特殊情况。
import math
data = {
"value": float('inf')
}
json_string = json.dumps(data, allow_nan=True)
print(json_string)
输出:
{"value": Infinity}
26. 处理 JSON 中的 set
JSON 不支持 set
类型,但可以通过将 set
转换为列表来处理。
data = {
"unique_numbers": {1, 2, 3}
}
json_string = json.dumps(data, default=list)
print(json_string)
输出:
{"unique_numbers": [1, 2, 3]}
27. 处理 JSON 中的 tuple
JSON 不支持 tuple
类型,但可以通过将 tuple
转换为列表来处理。
data = {
"coordinates": (10, 20)
}
json_string = json.dumps(data, default=list)
print(json_string)
输出:
{"coordinates": [10, 20]}
28. 处理 JSON 中的 datetime
JSON 不支持 datetime
类型,但可以通过将 datetime
对象转换为字符串来处理。
import json
from datetime import datetime
data = {
"created_at": datetime.now()
}
json_string = json.dumps(data, default=str)
print(json_string)
输出:
{"created_at": "2023-10-01 12:34:56.789012"}
29. 处理 JSON 中的 bytes
JSON 不支持 bytes
类型,但可以通过将 bytes
编码为 Base64 字符串来处理。
import json
import base64
data = {
"binary_data": b"hello"
}
json_string = json.dumps(data, default=lambda x: base64.b64encode(x).decode('utf-8'))
print(json_string)
输出:
{"binary_data": "aGVsbG8="}
30. 处理 JSON 中的 frozenset
JSON 不支持 frozenset
类型,但可以通过将 frozenset
转换为列表来处理。
data = {
"unique_numbers": frozenset({1, 2, 3})
}
json_string = json.dumps(data, default=list)
print(json_string)
输出:
{"unique_numbers": [1, 2, 3]}
31. 处理 JSON 中的 complex
JSON 不支持 complex
类型,但可以通过将 complex
转换为字符串或字典来处理。
data = {
"complex_number": 1 + 2j
}
json_string = json.dumps(data, default=str)
print(json_string)
输出:
{"complex_number": "(1+2j)"}
32. 处理 JSON 中的 range
JSON 不支持 range
类型,但可以通过将 range
转换为列表来处理。
data = {
"numbers": range(1, 5)
}
json_string = json.dumps(data, default=list)
print(json_string)
输出:
{"numbers": [1, 2, 3, 4]}
33. 处理 JSON 中的 memoryview
JSON 不支持 memoryview
类型,但可以通过将 memoryview
转换为字节串来处理。
data = {
"data": memoryview(b"hello")
}
json_string = json.dumps(data, default=lambda x: x.tobytes().decode('utf-8'))
print(json_string)
输出:
{"data": "hello"}
34. 处理 JSON 中的 bytearray
JSON 不支持 bytearray
类型,但可以通过将 bytearray
转换为字节串来处理。
data = {
"data": bytearray(b"hello")
}
json_string = json.dumps(data, default=lambda x: x.decode('utf-8'))
print(json_string)
输出:
{"data": "hello"}
35. 处理 JSON 中的 enum
JSON 不支持 enum
类型,但可以通过将 enum
转换为字符串或整数