Python 简明教程

Python - JSON

JSON in Python

Python 中的 JSON 是一种流行的数据格式,用于系统之间的数据交换。 json 模块提供用于处理 JSON 数据的函数,使您可以将 Python 对象序列化成 JSON 字符串,并将 JSON 字符串反序列化回 Python 对象。

JSON Serialization

JSON 序列化是将 Python 对象转换为 JSON 格式的过程。这对于以易于传输或存储的格式保存数据很有用,之后可以将其重新构建成其原始形式。

Python 提供了 json 模块来处理 JSON 序列化和反序列化。我们可以在此模块中使用 json.dumps() 方法进行序列化。

您可以将以下 Python 对象类型序列化为 JSON 字符串 −

  1. dict

  2. list

  3. tuple

  4. str

  5. int

  6. float

  7. bool

  8. None

Example

以下是有关如何将 Python 字典序列化为 JSON 字符串的基本示例 −

import json

# Python dictionary
data = {"name": "Alice", "age": 30, "city": "New York"}

# Serialize to JSON string
json_string = json.dumps(data)
print(json_string)

它将生成如下输出:

{"name": "Alice", "age": 30, "city": "New York"}

JSON Deserialization

JSON 反序列化是将 JSON 字符串转换回 Python 对象的过程。这对于读取和处理以 JSON 格式传输或存储的数据非常重要。

在 Python 中,我们可以使用 json.loads() 方法从 string 中反序列化 JSON 数据,并使用 json.load() 方法从 file 中反序列化 JSON 数据。

Example: Deserialize JSON string to Python object

在以下示例中,我们使用 json.loads() 方法将 JSON 字符串反序列化为 Python 字典:

import json

# JSON string
json_string = '{"name": "John", "age": 30, "is_student": false, "courses": ["Math", "Science"], "address": {"city": "New York", "state": "NY"}}'

# Deserialize JSON string to Python object
python_obj = json.loads(json_string)

print(python_obj)

以下是上面代码的输出: -

{'name': 'John', 'age': 30, 'is_student': False, 'courses': ['Math', 'Science'], 'address': {'city': 'New York', 'state': 'NY'}}

Example: Deserialize JSON from File

现在,要读取和反序列化文件中的 JSON 数据,我们使用 json.load() 方法:

import json

# Read and deserialize from file
with open("data.json", "r") as f:
   python_obj = json.load(f)

print(python_obj)

上述代码的输出如下:

{'name': 'John', 'age': 30, 'is_student': False, 'courses': ['Math', 'Science'], 'address': {'city': 'New York', 'state': 'NY'}}

Advanced JSON Handling

如果你的 JSON 数据包含需要特殊处理的对象(例如自定义类),则可以定义自定义反序列化函数。使用 json.loads()json.load() 方法的 object_hook 参数来指定将在每个解码的 JSON 对象的结果中调用的函数。

Example

在下面的示例中,我们演示了自定义对象序列化的用法:

import json
from datetime import datetime

# Custom deserialization function
def custom_deserializer(dct):
   if 'joined' in dct:
      dct['joined'] = datetime.fromisoformat(dct['joined'])
   return dct

# JSON string with datetime
json_string = '{"name": "John", "joined": "2021-05-17T10:15:00"}'

# Deserialize with custom function
python_obj = json.loads(json_string, object_hook=custom_deserializer)

print(python_obj)

我们得到了如下输出 −

{'name': 'John', 'joined': datetime.datetime(2021, 5, 17, 10, 15)}

JSONEncoder Class

Python 中的 JSONEncoder 类用于将 Python 数据结构编码为 JSON 格式。每个 Python 数据类型都转换为其相应的 JSON 类型,如下表所示:

JSONEncoder 类使用 JSONEncoder() 构造函数实例化。此类中定义了以下重要方法:

  1. encode(obj) - 将 Python 对象序列化为 JSON 格式的字符串。

  2. iterencode(obj) - 对对象进行编码并返回一个迭代器,该迭代器产生对象中每个项的编码形式。

  3. indent - 确定编码字符串的缩进级别。

  4. sort_keys - 如果为真,则键以排序顺序出现。

  5. check_circular - 如果为真,则检查容器类型对象中的循环引用。

Example

在以下示例中,我们对 Python 列表对象进行编码。我们使用 iterencode() 方法来显示编码字符串的每一部分:

import json

data = ['Rakesh', {'marks': (50, 60, 70)}]
e = json.JSONEncoder()

# Using iterencode() method
for obj in e.iterencode(data):
   print(obj)

它将生成如下输出:

["Rakesh"
,
{
"marks"
:
[50
, 60
, 70
]
}
]

JSONDecoder class

JSONDecoder 类用于将 JSON 字符串解码回 Python 数据结构。此类中的主要方法是 decode()

Example

在此示例中,“JSONEncoder”用于将 Python 列表编码为 JSON 字符串,“JSONDecoder”用于将 JSON 字符串解码回 Python 列表:

import json

data = ['Rakesh', {'marks': (50, 60, 70)}]
e = json.JSONEncoder()
s = e.encode(data)
d = json.JSONDecoder()
obj = d.decode(s)
print(obj, type(obj))

获得的结果如下所示 −

['Rakesh', {'marks': [50, 60, 70]}] <class 'list'>