当前位置: 首页 > article >正文

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 转换为字符串或整数


http://www.kler.cn/a/473533.html

相关文章:

  • 网络基础1 http1.0 1.1 http/2的演进史
  • 【传统枪机现代枪机的功能需求】
  • Elasticsearch分片数量是什么意思?
  • 【微服务】4、服务保护
  • 23.行号没有了怎么办 滚动条没有了怎么办 C#例子
  • 【STM32+CubeMX】 新建一个工程(STM32F407)
  • 力扣-数据结构-13【算法学习day.84】
  • 基于 Apache Commons Pool 实现的 gRPC 连接池管理类 GrpcChannelPool 性能分析与优化
  • HTMLHTML5革命:构建现代网页的终极指南 - 0. 课程目录设计
  • AI华佗?港中大、深圳大数据研究院提出医疗推理大模型HuatuoGPT-o1
  • 深度学习的加速器:Horovod,让分布式训练更简单高效!
  • Element plus中el-input框回车触发页面刷新问题以及解决办法
  • MYSQL---------SQL 应用优化
  • MSE学习
  • 【Vue】:解决动态更新 <video> 标签 src 属性后视频未刷新的问题
  • Google Chrome 去除更新 Windows
  • Unity 热更新基础知识
  • vue-整合校验validator demo
  • 79 Openssl3.0 RSA公钥加密数据
  • Fastapi + vue3 自动化测试平台(2)--日志中间件
  • WordPress Crypto插件前台任意用户登录漏洞复现(CVE-2024-9989)(附脚本)
  • 学习第六十二行
  • <论文>什么是胶囊神经网络?
  • 使用java springboot 使用 Redis 作为限流工具
  • 使用 SQL 和表格数据进行问答和 RAG(7)—将表格数据(CSV 或 Excel 文件)加载到向量数据库(ChromaDB)中
  • MySql---进阶篇(十一)----游标,条件处理程序,存储函数