python:JSON数据格式的转换
在Python中,JSON是一种流行的数据格式,用于系统之间的数据交换。json模块提供了一些函数来处理JSON数据,允许你将Python对象序列化为JSON字符串,以及将JSON字符串反序列化回Python对象。
JSON序列化
JSON序列化是将Python对象转换为JSON格式的过程。这在将数据保存为一种易于传输或存储的格式,并稍后重建回其原始形式时非常有用。
Python提供了json模块来处理JSON序列化和反序列化。我们可以使用这个模块中的json.dumps()方法来进行序列化。
json.dumps()方法
语法:
json.dumps(obj, *, skipkeys=False, ensure_ascii=True, check_circular=True, allow_nan=True, cls=None, indent=None, separators=None, default=None, sort_keys=False, **kw)
功能:将obj 序列化为 JSON 格式的字符串,使用下面的转换表:

dumps()方法的参数说明:
skipkeys:如果 skipkeys 为 True(默认值:False),会跳过那些不是基本类型(str、int、float、bool、None)的字典的key,而不会引发TypeError。ensure_ascii:如果 ensure_ascii 为 True(默认值),输出将确保所有传入的非 ASCII 字符都被转义。如果 ensure_ascii 为 False,这些字符将按原样输出。check_circular:如果 check_circular 为 False(默认值:True),则将跳过对容器类型的循环引用检查,循环引用将导致 RecursionError(或更糟)。allow_nan:如果 allow_nan 为 False(默认值:True),则在严格遵循 JSON 规范的情况下,序列化超出范围的浮点值(nan, inf, -inf)将引发 ValueError。如果 allow_nan 为 True,则会使用它们的 JavaScript 等价物(NaN, Infinity, -Infinity)。indent:如果 indent 是一个非负整数或字符串,那么 JSON 数组元素和对象成员将会以那个缩进级别进行美化打印。一个缩进级别为0、负数或空字符串(“”)只会插入换行符。使用 None(默认值)将选择最紧凑的表示方式。使用一个正整数缩进,每级会缩进那么多空格。如果 indent 是一个字符串(例如 "\t"),那么该字符串将用于每一级的缩进。separators:如果指定了 separators,它应该是一个 (item_separator, key_separator) 元组。如果 indent 是 None,默认值是 (', ', ': ') ,否则是 (',', ': ')。要获取最紧凑的 JSON 表示形式,你应该指定 (',', ':') 来消除空白字符。default:如果指定了 default,它应该是一个函数,用于处理那些无法被其他方式序列化的对象。这个函数应该返回一个可以被 JSON 编码的版本的对象,或者抛出一个 TypeError。如果没有指定 default,则会抛出 TypeError。sort_keys:如果 sort_keys 为True(默认值为False),则字典的输出将按键排序。示例
示例:将python字典转JSON字符串
import json
data = {'name': '张三', 'age': 18, 'score': 98.85, 'passed': True, 'hobby': ['running', 'reading']}
json_string = json.dumps(data)
print(type(json_string))
print(json_string)
运行结果:

从上面输出可以看到,中文是显示的编码。下面的示例中可以通过参数ensure_ascii=False控制将中文显示出来。
import json
data = {'name': '张三', 'age': 18, 'score': 98.85, 'passed': True, 'hobby': ['running', 'reading']}
json_string = json.dumps(data, ensure_ascii=False)
print(type(json_string))
print(json_string)
运行结果:

示例:将None转换为JSON
import json
print(json.dumps(None))
运行结果:

示例:将元组转换为JSON
import json
print(json.dumps(('good', 'day', 'python')))
运行结果:

示例:将列表转换为JSON
import json
data = ['good', 'day', 'python']
json_string = json.dumps(data)
print(json_string)
运行结果:

示例:将字符串转换为JSON
import json
data = 'hell world'
json_string = json.dumps(data)
print(json_string)
运行结果:

示例:将False转换为JSON
import json
data = False
json_string = json.dumps(data)
print(json_string)
运行结果:

示例:输出的JSON字典按照key排序
import json
data = {'c': 0, 'b':0, 'a':0}
json_string = json.dumps(data, sort_keys=True)
print(json_string)
运行输出:

示例:紧凑编码
import json
data = [1, 2, 3, {'4': 5, '6': 7}]
json_string = json.dumps(data, separators=(',', ':'))
print(json_string)
运行输出:

示例:美化打印
import json
data = [1, 2, 3, {'4': 5, '6': 7}]
json_string = json.dumps(data, sort_keys=True, indent=4)
print(json_string)
运行结果:

JSON反序列化
JSON反序列化是将JSON字符串转换回Python对象的过程。这对于读取和处理以JSON格式传输或存储的数据至关重要。
在Python中,我们可以使用json.loads()方法从字符串中反序列化JSON数据,并使用json.load()方法从文件中反序列化JSON数据。
json.loads()方法:从JSON字符串中反序列化
语法
json.loads(s, *, cls=None, object_hook=None, parse_float=None, parse_int=None, parse_constant=None, object_pairs_hook=None, **kw)
函数功能:
使用下面转换表将s反序列化为Python对象:

如果正在反序列化的数据不是有效的JSON文档,将会引发JSONDecodeError。
函数参数说明:
object_hook:object_hook 是一个可选的函数,它将在解码任何对象字面量(即字典)的结果时被调用。object_hook的返回值将代替该字典使用。这个特性可以用来实现自定义解码器。parse_float:是一个可选的函数,它将在解码每个 JSON 浮点数字符串时被调用。默认情况下,这相当于float(num_str)。这可以用来使用另一个数据类型或解析器来处理 JSON 浮点数(例如decimal.Decimal)。parse_int:parse_int 是一个可选的函数,它将在解码每个 JSON 整数字符串时被调用。默认情况下,这相当于int(num_str)。这可以用来使用另一个数据类型或解析器来处理 JSON 整数(例如 float)。parse_constant:parse_constant 是一个可选的函数,它将在遇到以下字符串之一时被调用:'-Infinity', 'Infinity', 'NaN'。这可以用来在遇到无效的 JSON 数字时引发异常。示例1
import json
json_string = '["foo", {"bar": ["baz", null, 1.0, 2, false, true]}]'
python_object = json.loads(json_string)
print(python_object)
运行结果:

json.load()方法:从文件中反序列化
语法
json.load(fp, *, cls=None, object_hook=None, parse_float=None, parse_int=None, parse_constant=None, object_pairs_hook=None, **kw)
功能:使用下面转换表将 fp(一个支持 .read() 方法的文本文件或包含 JSON 文档的二进制文件)反序列化为 Python 对象。

方法的参数:
json.loads()的参数说明。示例:从文件中反序列化
提前准备一个data.json文件:
{
"姓名": "Tom",
"年龄":18,
"是否学生": false,
"课程": ["English", "Math", "Python"],
"地址": {"省份": "陕西", "城市": "延安"}
}
用下面代码反序列化:
import json
with open('data.json', 'r', encoding='UTF-8') as f:
python_obj = json.load(f)
print(python_obj)
运行输出:

作者:听海边涛声