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)
运行输出:
作者:听海边涛声