Python - JSON



Python 中的 JSON

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

JSON(JavaScript 对象表示法)是一种轻量级的数据交换格式,易于人类读取和编写,也易于机器解析和生成。它主要用于以文本形式在服务器和 Web 应用程序之间传输数据。

JSON 序列化

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

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

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

  • 字典
  • 列表
  • 元组
  • 字符串
  • 整数
  • 浮点数
  • 布尔值
  • None

示例

以下是如何将 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 反序列化

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

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

示例:将 JSON 字符串反序列化为 Python 对象

在下面的示例中,我们使用 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'}}

示例:从文件反序列化 JSON

现在,要读取并从文件反序列化 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'}}

高级 JSON 处理

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

示例

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

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 类

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

Python JSON
字典 对象
列表、元组 数组
字符串 字符串
整数、浮点数、整数和浮点数派生的枚举 数字
True true
False false
None None

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

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

  • iterencode(obj) − 编码对象并返回一个迭代器,该迭代器会生成对象中每个项目的编码形式。

  • indent − 确定编码字符串的缩进级别。

  • sort_keys − 如果为 True,则键按排序顺序显示。

  • check_circular − 如果为 True,则检查容器类型对象中的循环引用。

示例

在以下示例中,我们正在编码 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 类

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

示例

在此示例中,“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'>
广告

© . All rights reserved.