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 中的 NaNInfinity

JSON 标准不支持 NaNInfinity,但 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 中的布尔值用 truefalse 表示,Python 中的 TrueFalse 会被转换为 truefalse

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 中的 truefalse

JSON 中的 truefalse 表示布尔值,Python 中的 TrueFalse 会被转换为 truefalse

data = {
    "is_student": True,
    "is_employed": False
}

json_string = json.dumps(data)
print(json_string)

输出:

{"is_student": true, "is_employed": false}

25. 处理 JSON 中的 InfinityNaN

JSON 标准不支持 InfinityNaN,但 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 转换为字符串或整数

你可能感兴趣的:(json,python,开发语言)