Python JSON模块核心功能:loads、load、dump、dumps全面解析

文章目录

  • 1 函数介绍
  • 2 json.load()
  • 2.1 语法格式
  • 2.2 异常说明
  • 2.3 返回值说明
  • 2.4 注意事项
  • 2.5 示例
  • 2.5.1 示例数据
  • 2.5.2 基本用法
  • 2.5.3 自定义解析
  • 3 json.loads()
  • 3.1 语法格式
  • 3.2 返回值说明
  • 3.3 注意事项
  • 3.4 示例
  • 3.4.1 基本用法
  • 3.4.2 自定义解析
  • 3.4.3 网络请求
  • 4 json.dump()
  • 4.1 语法格式
  • 4.2 返回值说明
  • 4.3 注意事项
  • 4.4 示例
  • 4.4.1 基本用法
  • 4.4.2 自定义化序列
  • 5 json.dumps()
  • 5.1 语法格式
  • 5.2 返回值说明
  • 5.3 注意事项
  • 5.4 示例
  • 5.4.1 基本用法
  • 5.4.2 自定义序列化

  • 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, InfinityNaN。 这可被用于在遇到无效的 JSON 数字时引发异常。 默认值为 None。
    object_pairs_hook: 可选函数,如果设置,将是一个在调用时以对照值的有序列表进行解码的任意对象字面值作为参数的函数。该函数的返回值将代替该dict使用。此特性可被用于实现自定义解码器。如果还设置了object_hook,则object_pairs_hook的优先级更高,默认值为None。

    2.2 异常说明

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

    2.3 返回值说明

    json.load()返回一个Python对象,具体类型取决于JSON文件的内容:

    JSON对象({})会被解析为Python的dict
    JSON数组([])会被解析为Python的list
    JSON字符串("...")会被解析为Python的str
    JSON数字(123或12.3)会被解析为Python的intfloat
    JSON的truefalsenull会被解析为Python的TrueFalseNone

    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,bytesbytearray实例)反序列化为Python对象。

    3.2 返回值说明

    json.loads()返回一个Python对象,具体类型取决于JSON文件的内容:

    JSON对象({})会被解析为Python的dict
    JSON数组([])会被解析为Python的list
    JSON字符串("...")会被解析为Python的str
    JSON数字(123或12.3)会被解析为Python的intfloat
    JSON的truefalsenull会被解析为Python的TrueFalseNone

    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)
    

    作者:Karl_zhujt

    物联沃分享整理
    物联沃-IOTWORD物联网 » Python JSON模块核心功能:loads、load、dump、dumps全面解析

    发表回复