宝塔山 发表于 6 天前

Python JSON模块loads、load、dump、dumps详解

1 函数介绍

函数名称函数描述json.load()用于从文件对象中读取 JSON 数据,并将其剖析为 Python 对象。json.loads()用于将JSON 格式的字符串剖析为 Python 对象json.dump()用于将 Python 对象序列化为 JSON 格式,并将其写入文件。json.dumps()用于将 Python 对象序列化为JSON 格式的字符串。 2 json.load()

json.load()是Python中json模块提供的一个函数,用于从文件对象中读取JSON数据,并将其剖析为Python对象。
2.1 语法格式

json.load(fp, *, cls=None, object_hook=None, parse_float=None, parse_int=None, parse_constant=None, object_pairs_hook=None, **kw)
参数分析:
   fp: 一个包含要执行反序列化的 JSON 文档的支持.read()的 text file 或 binary file。
cls: 如果设定此参数,则利用自定义的JSON解码器。任何通报给load()方法的多余关键字参数都会被通报给cls的构造器。如果传入None(默认值),则会利用JSONDecoder。
object_hook: 可选函数,如果设置,将是一个在调用时以任意被解码的对象字面值(即一个dict)作为参数的函数。该函数的返回值将取代该dict利用。此特性可被用于实现自定义解码器,比方JSON-RPC类提示。默认值为None。
parse_float: 可选函数,如果设置,将是一个在调用时以代表每个要解码的JSON浮点数的字符串作为参数的函数。如为None(默认值),则它等价于float(num_str)。这可被用于将JSON浮点数剖析为自定义数据范例,比方decimal.Decimal。
parse_int: 可选函数,如果设置,将是一个在调用时以代表每个要解码的JSON整数的字符串作为参数的函数。如为None(默认值),则它等价于int(num_str)。这可被用于将JSON整数剖析为自定义数据范例,比方float。
parse_constant: 可选函数,如果设置,将是一个以下列字符串之一作为参数的函数: -Infinity, Infinity 或 NaN。 这可被用于在碰到无效的 JSON 数字时引发异常。 默认值为 None。
object_pairs_hook: 可选函数,如果设置,将是一个在调用时以对照值的有序列表进行解码的任意对象字面值作为参数的函数。该函数的返回值将取代该dict利用。此特性可被用于实现自定义解码器。如果还设置了object_hook,则object_pairs_hook的优先级更高,默认值为None。
2.2 异常分析

JSONDecodeError: 当被反序列化的数据不是合法的JSON文档。
UnicodeDecodeError: 当被反序列化的数据不包含UTF-8,UTF-16或UTF-32编码的数据。
2.3 返回值分析

json.load()返回一个Python对象,具体范例取决于JSON文件的内容:
   JSON对象({})会被剖析为Python的dict。
JSON数组([])会被剖析为Python的list。
JSON字符串("...")会被剖析为Python的str。
JSON数字(123或12.3)会被剖析为Python的int或float。
JSON的true、false和null会被剖析为Python的True、False和None。
2.4 注意事项

文件编码: 在打开文件时,确保指定精确的编码(如utf-8),否则可能会因编码问题导致剖析失败。
文件路径: 确保文件路径精确,否则会抛出FileNotFoundError异常。
JSON格式必须精确: 如果JSON文件格式不精确(如缺少引号、括号不匹配等),会抛出json.JSONDecodeError异常。
性能问题: 对于非常大的JSON文件,json.load()会将整个文件加载到内存中。如果内存有限,可以思量利用流式剖析工具(如ijson)。
2.5 示例

2.5.1 示例数据

data.json文件内容如下:
{
        "name": "辰南",
        "age": 10028.26,
        "skill": ["唤魔经", "太上忘情录", "通天动地魔功"]
}
2.5.2 根本用法

import json

# 打开文件并读取JSON数据
with open('data.json', 'r', encoding='utf-8') as f:
    data = json.load(f)

print(data) # {'name': '辰南', 'age': 10028, 'skill': ['唤魔经', '太上忘情录', '通天动地魔功']}
print(type(data)) # <class 'dict'>
2.5.3 自定义剖析

import json


def custom_parse_float(value):
    """
    自定义浮点数解析函数
    :param value:传入浮点数
    :return:返回保留一位小数的值
    """
    return round(float(value), 1)# 保留一位小数


# 打开文件并读取 JSON 数据
with open('data.json', 'r', encoding='utf-8') as f:
    data = json.load(f, parse_float=custom_parse_float)

print(data)# {'name': '辰南', 'age': 10028.3, 'skill': ['唤魔经', '太上忘情录', '通天动地魔功']}
3 json.loads()

json.loads()是Python中json模块提供的一个函数,用于将JSON格式的字符串剖析为Python对象。JSON(JavaScript Object Notation)是一种轻量级的数据交换格式,常用于数据传输和配置文件。
3.1 语法格式

json.loads(s, *, cls=None, object_hook=None, parse_float=None, parse_int=None, parse_constant=None, object_pairs_hook=None, **kw)
类似于load(),但不是针对文件型对象,而是利用这个转换表将s(一个包含JSON的str,bytes或bytearray实例)反序列化为Python对象。
3.2 返回值分析

json.loads()返回一个Python对象,具体范例取决于JSON文件的内容:
   JSON对象({})会被剖析为Python的dict。
JSON数组([])会被剖析为Python的list。
JSON字符串("...")会被剖析为Python的str。
JSON数字(123或12.3)会被剖析为Python的int或float。
JSON的true、false和null会被剖析为Python的True、False和None。
3.3 注意事项

JSON字符串必须符及格式: 如果JSON字符串格式不精确(如缺少引号、括号不匹配等),会抛出json.JSONDecodeError异常。
性能问题: 对于非常大的JSON数据,发起利用json.load()从文件流中读取,而不是一次性加载到内存中。
3.4 示例

3.4.1 根本用法

import json

# JSON 格式的字符串
json_str = '{"name": "辰南", "age": 10028.3, "skill": ["唤魔经", "太上忘情录", "通天动地魔功"]}'

# 解析为 Python 字典
data = json.loads(json_str)

print(data) # {'name': '辰南', 'age': 10028.3, 'skill': ['唤魔经', '太上忘情录', '通天动地魔功']}
print(type(data)) # <class 'dict'>
3.4.2 自定义剖析

import json

# JSON 格式的字符串
json_str = '{"name": "辰南", "age": 10028.26, "skill": ["唤魔经", "太上忘情录", "通天动地魔功"]}'


# 自定义浮点数解析函数
def custom_parse_float(value):
    """
    自定义浮点数解析函数
    :param value:传入浮点数
    :return:返回保留一位小数的值
    """
    return round(float(value), 1)# 保留一位小数


# 解析 JSON 字符串
data = json.loads(json_str, parse_float=custom_parse_float)

print(data) # {'name': '辰南', 'age': 10028.3, 'skill': ['唤魔经', '太上忘情录', '通天动地魔功']}
print(type(data))# <class 'dict'>
3.4.3 网络请求

import requests
import json

# 字典类型的表单参数
data = {'辰南': '从神墓爬出来',
      '楚月': '辰南老婆之一'}
# 发送网络请求
res = requests.post('http://httpbin.org/post', data=data)
res_dict = json.loads(res.text)# 将响应数据转换为字典类型
print(res_dict)
print(type(res_dict))
4 json.dump()

json.dump()是Python中json模块提供的一个函数,用于将Python对象序列化为JSON格式,并将其写入文件。与json.dumps()差别,json.dump()直接将数据写入文件对象,而不是返回一个字符串。
4.1 语法格式

json.dump(obj, fp, *, skipkeys=False, ensure_ascii=True, check_circular=True, allow_nan=True, cls=None, indent=None, separators=None, default=None, sort_keys=False, **kw)
参数分析:
   obj: 要序列化的Python对象。
fp: 文件型对象obj将为序列化输出的目的。json模块总是产生str对象,而不是bytes对象,因此fp.write()必须支持str输入。
skipkeys: 如为True,则不为根本范例(str,int,float,bool,None)的键将被跳过而不会引发TypeError。默认为False。
ensure_ascii: 如为True(默认值),则输出将保证对全部输入的非ASCII字符进行转义。如为False,这些字符将被原样输出。
check_circular: 如为False,则对容器范例的循环引用查抄会被跳过而且循环引用将导致RecursionError(或更糟的情况)。默认为True。
allow_nan: 如为False,则对超范围的float值(nan,inf,-inf)进行序列化将导致ValueError,以严酷遵照JSON规范。如为True(默认值),则将利用它们的JavaScript等价形式(NaN,Infinity,-Infinity)。
cls: 如果设置,则重写为一个带有default()方法的自定义JSON编码器,用以序列化为自定义的数据范例。如为None(默认值),则利用JSONEncoder。
indent: 如为一个正整数或字符串,JSON数组元素和对象成员将按其所指定的缩进层级美化打印。正整数表示每级缩进指定数目的空格;字符串(如"\t")则被用于每级缩进。如为零、负数或""(空字符串),则仅插入换行符。如为None(默认值),则利用最紧凑表示形式。
separators: 一个二元组:(item_separator,key_separator)。如为None(默认值),则默认当indent为None时separators为(',',':'),否则为(',',':')。要利用最紧凑形式的JSON,可指定(‘,’,‘:’)来去除空格。
default: 当对象无法被序列化时将被调用的函数。它应该返回一个可被JSON编码的版本或是引发TypeError。如为None(默认值),则会引发TypeError。
sort_keys: 如为True,则字典输出将按键排序。默认为False。
4.2 返回值分析

json.dump() 没有返回值,它会将序列化后的 JSON 数据直接写入文件。
4.3 注意事项

文件模式: 在打开文件时,确保利用写入模式(如'w'),否则会抛堕落误。
非字符串键: 如果字典的键不是字符串范例,默认会抛出TypeError。可以通过设置skipkeys=True跳过这些键。
特殊值: 默认情况下,NaN、Infinity等特殊值可以被序列化。如果不必要,可以设置allow_nan=False。
性能问题: 对于非常大的数据,json.dump()会将整个对象加载到内存中。如果内存有限,可以思量利用流式写入工具。
4.4 示例

4.4.1 根本用法

import json

# Python 字典
data = {
    "name": "辰南",
    "age": 10028.26,
    "skill": ["唤魔经", "太上忘情录", "通天动地魔功"]
}

# 打开文件并写入 JSON 数据
with open('output.json', 'w', encoding='utf-8') as f:
    json.dump(data, f)
4.4.2 自定义化序列

如果 Python 对象中包含无法直接序列化的范例(如 datetime),可以利用default参数指定一个处理函数:
import json
from datetime import datetime


def custom_serializer(obj):
    """
    自定义序列化函数
    :param obj:
    :return:
    """
    # 判断数据是否为日期
    if isinstance(obj, datetime):
      return obj.strftime('%Y-%m-%d %H:%M:%S')# 将 datetime 转换为字符串
    raise TypeError("Type not serializable")


# Python 字典,包含 datetime 对象
data = {
    "name": "辰南",
    "age": 10028.26,
    "skill": ["唤魔经", "太上忘情录", "通天动地魔功"],
    "created": datetime.now()
}

# 打开文件并写入 JSON 数据
with open('output.json', 'w', encoding='utf-8') as f:
    json.dump(data, f, default=custom_serializer, indent=4, ensure_ascii=False)
5 json.dumps()

json.dumps()是Python中json模块提供的一个函数,用于将Python对象序列化为JSON格式的字符串。与json.dump()差别,json.dumps()返回一个字符串,而不是直接写入文件。
5.1 语法格式

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格式的str。其参数的含义与dump()中的相同。
5.2 返回值分析

json.dumps() 返回一个 JSON 格式的字符串。
5.3 注意事项

非字符串键: 如果字典的键不是字符串范例,默认会抛出TypeError。可以通过设置skipkeys=True跳过这些键。
特殊值: 默认情况下,NaN、Infinity等特殊值可以被序列化。如果不必要,可以设置allow_nan=False。
编码问题: 如果ensure_ascii=True(默认),全部非ASCII字符会被转义为\uXXXX格式。如果盼望保留原始字符,可以设置ensure_ascii=False。
性能问题: 对于非常大的数据,json.dumps()会将整个对象加载到内存中。如果内存有限,可以思量利用流式处理工具。
5.4 示例

5.4.1 根本用法

import json

# Python 字典
data = {
    "name": "辰南",
    "age": 10028.26,
    "skill": ["唤魔经", "太上忘情录", "通天动地魔功"]
}

# 序列化为 JSON 字符串
json_str = json.dumps(data,ensure_ascii=False)

print(json_str) # {"name": "辰南", "age": 10028.26, "skill": ["唤魔经", "太上忘情录", "通天动地魔功"]}
5.4.2 自定义序列化

如果 Python 对象中包含无法直接序列化的范例(如 datetime),可以利用default参数指定一个处理函数:
import json
from datetime import datetime


def custom_serializer(obj):
    """
    自定义序列化函数
    :param obj:
    :return:
    """
    if isinstance(obj, datetime):
      return obj.strftime('%Y-%m-%d %H:%M:%S')# 将 datetime 转换为字符串
    raise TypeError("Type not serializable")


# Python 字典,包含 datetime 对象
data = {
    "name": "辰南",
    "age": 10028.26,
    "skill": ["唤魔经", "太上忘情录", "通天动地魔功"],
    "created": datetime.now()
}

# 序列化为 JSON 字符串,indent:美化,ensure_ascii:输出中文,sort_keys:排序
json_str = json.dumps(data, default=custom_serializer, indent=4, ensure_ascii=False, sort_keys=True)

print(json_str)

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
页: [1]
查看完整版本: Python JSON模块loads、load、dump、dumps详解