前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >你真的会用Python中的JSON吗,超级详细的JSON常用方法讲解,一文搞定JSON!

你真的会用Python中的JSON吗,超级详细的JSON常用方法讲解,一文搞定JSON!

作者头像
小白的大数据之旅
发布2024-11-20 18:55:39
发布2024-11-20 18:55:39
72900
代码可运行
举报
运行总次数:0
代码可运行

Python中JSON的常用方法

方法名称

描述

json.loads()

将JSON格式的字符串解析成Python对象(如字典或列表)

json.dumps()

将Python对象(如字典或列表)转换成JSON格式的字符串

json.load()

从文件中读取JSON格式的数据,并解析成Python对象

json.dump()

将Python对象转换成JSON格式的数据,并写入文件

json.JSONDecoder()

创建一个JSON解码器对象,用于解析JSON字符串(通常直接使用json.loads()更常见)

json.JSONEncoder()

创建一个JSON编码器对象,用于将Python对象转换成JSON字符串(通常直接使用json.dumps()更常见)

json.JSONDecodeError

异常类,用于处理JSON解码时发生的错误

json.loads()

json.loads() 是Python标准库 json 模块中的一个函数,用于将JSON格式的字符串解析(解码)成Python对象。这个过程是反序列化的一部分,即将数据从一种格式(在这个情况下是JSON字符串)转换成另一种格式(在这个情况下是Python的数据结构,如字典或列表)。

参数
  • s (str): 要解码的JSON字符串。
  • *, **kwargs: 其他可选参数,用于指定解码行为,如 object_hook, parse_float, parse_int, parse_constant, object_pairs_hook, json_loads 等。这些参数允许用户自定义解码过程,例如将JSON对象转换成特定的Python对象类型。
返回值

Python对象:通常是字典(对应于JSON对象)或列表(对应于JSON数组)。如果JSON字符串表示的是其他类型(如字符串、数字、布尔值、null),则返回相应的Python类型。

示例
代码语言:javascript
代码运行次数:0
运行
复制
import json  
  
# 一个简单的JSON字符串  
json_str = '{"name": "Alice", "age": 30, "is_student": false}'  
  
# 使用json.loads()将JSON字符串解析成Python对象  
python_obj = json.loads(json_str)  
  
# 打印解析后的Python对象  
print(python_obj)  # 输出: {'name': 'Alice', 'age': 30, 'is_student': False}  
  
# 访问解析后的对象属性  
print(python_obj['name'])  # 输出: Alice  
print(python_obj['age'])   # 输出: 30  
print(python_obj['is_student'])  # 输出: False
注意事项
  • JSON字符串必须使用双引号(")来包围键和字符串值。如果使用单引号('),则会导致解码错误。
  • JSON中的布尔值 true 和 false 会被转换成Python中的 True 和 False。
  • JSON中的 null 会被转换成Python中的 None。
  • 如果JSON字符串格式不正确(例如缺少引号、括号不匹配等),json.loads() 会抛出一个 json.JSONDecodeError 异常。

json.dumps()

json.dumps() 是Python标准库 json 模块中的一个函数,用于将Python对象编码(序列化)成JSON格式的字符串。这个过程是序列化的一部分,即将数据从一种格式(在这个情况下是Python的数据结构,如字典或列表)转换成另一种格式(在这个情况下是JSON字符串)。

参数
  • obj (any): 要编码的Python对象。它通常是字典(对应于JSON对象)或列表(对应于JSON数组),但也可以是其他类型,如字符串、数字、布尔值、None等。
  • skipkeys (bool, optional): 默认为False。如果字典的键不是基本类型(即str, int, float, bool, None),则设置为True可以跳过这些键;否则将引发TypeError。
  • ensure_ascii (bool, optional): 默认为True。如果设置为False,则尝试将非ASCII字符(如中文)输出为\uXXXX形式的Unicode转义字符之外的字符。请注意,这可能会产生不可读的输出在非ASCII平台的print函数中,因为print函数可能会使用系统默认的编码来解码字节字符串。在Python 3.x中,字符串是Unicode的,所以这个选项主要影响字节字符串的输出。
  • check_circular (bool, optional): 默认为True。如果设置为False,则跳过对容器类型的循环引用的检查(这可能会引发OverflowError)。
  • allow_nan (bool, optional): 默认为True。如果设置为False,则序列化过程中会将浮点数中的NaN、Infinity和-Infinity转换为null。
  • sort_keys (bool, optional): 默认为False。如果设置为True,则字典的键会按照键的Unicode码点排序。
  • indent (int or str, optional): 如果指定为整数,则使用指定的缩进级别来美化输出的JSON字符串。如果指定为字符串(如\t),则使用该字符串作为缩进字符。
  • separators (tuple, optional): 一个(item_separator, key_separator)元组,用于指定分隔符。默认为(', ', ‘: ‘)。如果指定为(’,’, ‘:’),则输出的字符串会更紧凑。
  • default (function, optional): 一个函数,用于将不可序列化的对象转换为一个可序列化的表示。默认情况下,不可序列化的对象会引发TypeError。 *, **kwargs: 其他可选参数,用于进一步定制序列化行为。
返回值

str: 编码后的JSON格式的字符串。

示例
代码语言:javascript
代码运行次数:0
运行
复制
import json  
  
# 一个简单的Python对象(字典)  
python_obj = {'name': 'Alice', 'age': 30, 'is_student': False}  
  
# 使用json.dumps()将Python对象编码成JSON字符串  
json_str = json.dumps(python_obj)  
  
# 打印编码后的JSON字符串  
print(json_str)  # 输出: '{"name": "Alice", "age": 30, "is_student": false}'  
  
# 使用indent参数来美化输出  
pretty_json_str = json.dumps(python_obj, indent=4)  
print(pretty_json_str)  
# 输出:  
# {  
#     "name": "Alice",  
#     "age": 30,  
#     "is_student": false  
# }
注意事项
  • 编码后的JSON字符串使用双引号(")来包围键和字符串值。
  • Python中的布尔值 True 和 False 会被转换成JSON中的 true 和 false。
  • Python中的 None 会被转换成JSON中的 null。
  • 如果Python对象包含无法直接转换成JSON的类型(如自定义对象),则可以使用default参数来提供一个自定义的序列化函数。
  • json.dumps() 不会直接写入文件;要将JSON字符串写入文件,请使用json.dump()方法。

json.load()

json.load() 是Python标准库 json 模块中的一个函数,用于从文件中读取JSON格式的数据,并将其解析(解码)成Python对象。这个过程是反序列化的一部分,即将数据从一种格式(在这个情况下是JSON文件)转换成另一种格式(在这个情况下是Python的数据结构,如字典或列表)。

参数
  • fp (file-like object): 一个文件对象,它应该是一个支持.read()方法的对象,并且包含JSON格式的数据。这通常是一个打开的文件,但也可以是任何实现了文件接口的对象。
  • *, **kwargs: 其他可选参数,用于指定解码行为,如 object_hook, parse_float, parse_int, parse_constant, object_pairs_hook, cls 等。这些参数允许用户自定义解码过程,例如将JSON对象转换成特定的Python对象类型。
返回值

Python对象:通常是字典(对应于JSON对象)或列表(对应于JSON数组)。如果JSON文件表示的是其他类型(如字符串、数字、布尔值、null),则返回相应的Python类型。

示例
代码语言:javascript
代码运行次数:0
运行
复制
import json  
  
# 假设有一个名为'data.json'的文件,内容如下:  
# {  
#     "name": "Alice",  
#     "age": 30,  
#     "is_student": false  
# }  
  
# 打开JSON文件并读取数据  
with open('data.json', 'r', encoding='utf-8') as f:  
    python_obj = json.load(f)  
  
# 打印解析后的Python对象  
print(python_obj)  # 输出: {'name': 'Alice', 'age': 30, 'is_student': False}  
  
# 访问解析后的对象属性  
print(python_obj['name'])  # 输出: Alice
注意事项
  • 文件应该以读取模式(‘r’)打开,并且通常应该指定文件的编码(如’utf-8’),以确保正确读取文件中的字符。
  • JSON文件中的字符串必须使用双引号(")来包围键和字符串值。
  • 如果JSON文件格式不正确(例如缺少引号、括号不匹配等),json.load() 会抛出一个 json.JSONDecodeError 异常。
  • json.load() 直接从文件中读取并解析JSON数据,而不需要先将文件内容读入一个字符串变量。

json.dump()

json.dump() 是Python标准库 json 模块中的一个函数,用于将Python对象编码(序列化)成JSON格式,并将结果写入到一个文件中。这个过程是序列化的一部分,即将数据从一种格式(在这个情况下是Python的数据结构,如字典或列表)转换成另一种格式(在这个情况下是JSON文件)。

参数

  • obj (any): 要编码的Python对象。它通常是字典(对应于JSON对象)或列表(对应于JSON数组),但也可以是其他类型,如字符串、数字、布尔值、None等。
  • fp (file-like object): 一个文件对象,它应该是一个支持.write()方法的对象,用于写入JSON格式的数据。这通常是一个打开的文件,但也可以是任何实现了文件接口的对象。
  • skipkeys (bool, optional): 默认为False。如果字典的键不是基本类型(即str, int, float, bool, None),则设置为True可以跳过这些键;否则将引发TypeError。
  • ensure_ascii (bool, optional): 默认为True。如果设置为False,则尝试将非ASCII字符(如中文)输出为\uXXXX形式的Unicode转义字符之外的字符。请注意,在写入文件时,这通常不是问题,因为文件可以保存任何字节。但是,如果文件被当作文本文件处理(例如,在某些编辑器或查看器中打开),则可能需要确保文件的编码与ensure_ascii=False时写入的字符相匹配。
  • check_circular (bool, optional): 默认为True。如果设置为False,则跳过对容器类型的循环引用的检查(这可能会引发OverflowError)。
  • allow_nan (bool, optional): 默认为True。如果设置为False,则序列化过程中会将浮点数中的NaN、Infinity和-Infinity转换为null。
  • sort_keys (bool, optional): 默认为False。如果设置为True,则字典的键会按照键的Unicode码点排序后写入文件。
  • indent (int or str, optional): 如果指定为整数,则使用指定的缩进级别来美化输出的JSON。如果指定为字符串(如\t),则使用该字符串作为缩进字符。
  • separators (tuple, optional): 一个(item_separator, key_separator)元组,用于指定分隔符。默认为(', ', ‘: ‘)。如果指定为(’,’, ‘:’),则输出的字符串会更紧凑。
  • default (function, optional): 一个函数,用于将不可序列化的对象转换为一个可序列化的表示。默认情况下,不可序列化的对象会引发TypeError。 *, **kwargs: 其他可选参数,用于进一步定制序列化行为。
返回值

None:json.dump() 不返回任何值,它将编码后的JSON数据直接写入到提供的文件对象中。

示例
代码语言:javascript
代码运行次数:0
运行
复制
import json  
  
# 一个简单的Python对象(字典)  
python_obj = {'name': 'Alice', 'age': 30, 'is_student': False}  
  
# 打开一个文件以写入JSON数据  
with open('output.json', 'w', encoding='utf-8') as f:  
    json.dump(python_obj, f)  
  
# 现在'output.json'文件包含了编码后的JSON数据
注意事项
  • 文件应该以写入模式(‘w’、‘a’等)打开,并且通常应该指定文件的编码(如’utf-8’),以确保正确写入文件中的字符。
  • 如果ensure_ascii设置为False,并且文件中包含非ASCII字符,请确保文件的编码与这些字符相匹配,否则在某些环境中可能会出现乱码。
  • json.dump() 直接将Python对象编码成JSON格式并写入文件,而不需要先将数据转换成字符串。
  • 如果提供的文件对象不支持.write()方法,json.dump() 会抛出一个异常。

json.JSONDecoder 类

json.JSONDecoder 提供了一个接口来解码JSON字符串。你可以创建一个JSONDecoder实例,然后使用它的.decode()方法来解码JSON数据。

构造函数
代码语言:javascript
代码运行次数:0
运行
复制
json.JSONDecoder(object_hook=None, parse_float=None, parse_int=None, parse_constant=None, strict=True, object_pairs_hook=None)
  • object_hook:一个可选的函数,它将对每个解码的字典对象调用。这个函数应该接受一个字典作为参数,并返回另一个对象(通常是自定义的字典子类或其他类型的对象)。
  • parse_float、parse_int:这两个可选的函数分别用于解析JSON中的浮点数和整数。它们将接收一个字符串作为参数,并返回相应的浮点数或整数。
  • parse_constant:一个可选的函数,用于解析JSON中的特殊浮点值(如NaN、Infinity和-Infinity)。这个函数将接收一个字符串作为参数,并返回相应的特殊浮点值。
  • strict:如果设置为False,则解码器将尝试解析非标准的JSON(例如,允许尾随逗号)。默认值为True,表示严格遵循JSON标准。
  • object_pairs_hook:一个可选的函数,类似于object_hook,但它用于处理解码后的有序对列表(即列表中的元素是二元组,而不是字典)。这个函数应该接受一个有序对列表作为参数,并返回另一个对象(例如,一个有序字典)。
方法

.decode(s, _w=None): 解码JSON字符串s。_w是一个内部参数,通常不需要用户设置。

示例
代码语言:javascript
代码运行次数:0
运行
复制
import json  
  
# 创建一个JSONDecoder实例  
decoder = json.JSONDecoder(object_hook=lambda d: {k.upper(): v for k, v in d.items()})  
  
# JSON字符串  
json_str = '{"name": "Alice", "age": 25}'  
  
# 解码JSON字符串  
decoded_obj = decoder.decode(json_str)  
  
# 打印解码后的对象  
print(decoded_obj)  # 输出: {'NAME': 'Alice', 'AGE': 25}

在这个示例中,我们创建了一个JSONDecoder实例,并通过object_hook参数提供了一个函数,该函数将解码后的字典中的所有键转换为大写。然后,我们使用这个解码器的.decode()方法来解码一个JSON字符串,并打印出解码后的对象。

注意事项
  • 通常情况下,直接使用json.loads()函数就足够了,因为它提供了与JSONDecoder相同的解码功能,但使用起来更简单。
  • 如果你需要处理大量的JSON数据或需要重用解码器对象,那么使用JSONDecoder可能会更有效。
  • 在使用object_hook、parse_float、parse_int、parse_constant和object_pairs_hook参数时,请确保提供的函数能够正确处理输入并返回预期的输出。

json.JSONEncoder 类

在Python的json模块中,json.JSONEncoder是一个类,它提供了将Python对象编码(即序列化)为JSON字符串的接口。虽然json.dumps()函数是序列化Python对象为JSON字符串的常用方法,但在需要更细粒度的控制或想要重用编码器对象的情况下,可以使用json.JSONEncoder。 json.JSONEncoder类允许你创建一个编码器实例,并通过其.encode()方法将Python对象转换为JSON字符串。

构造函数
代码语言:javascript
代码运行次数:0
运行
复制
json.JSONEncoder(skipkeys=False, ensure_ascii=True, check_circular=True, allow_nan=True, sort_keys=False, indent=None, separators=None, default=None)
  • skipkeys:如果为True,则跳过字典中无法编码为JSON的键(通常是那些其str()表示形式不是字符串的键)。默认值为False。
  • ensure_ascii:如果为True,则所有非ASCII字符都将转义为\uXXXX形式的Unicode转义序列。默认值为True。如果为False,则尝试直接使用Unicode字符(这可能需要你的环境支持显示这些字符)。
  • check_circular:如果为True,则检测并引发TypeError以阻止循环引用(例如,字典直接或间接地引用自己)。默认值为True。
  • allow_nan:如果为True,则允许将NaN、Infinity和-Infinity等浮点值编码为它们的JSON等价物(null、“Infinity"和”-Infinity")。默认值为True。
  • sort_keys:如果为True,则对字典的键进行排序(按照Unicode码点顺序)。默认值为False。
  • indent:一个用于美化输出的整数或字符串。如果是一个整数,则表示每个级别的缩进量(以空格为单位)。如果是一个字符串(如\t),则使用该字符串作为缩进字符。默认值为None,表示不添加任何缩进。
  • separators:一个(item_separator, key_separator)元组,用于指定项之间和键-值对之间的分隔符。默认值为(', ', ': '),表示使用逗号和冒号作为分隔符。
  • default:一个用于处理无法直接编码为JSON的对象的函数。这个函数应该接受一个无法编码的对象,并返回一个可以编码的对象(例如,一个基本数据类型或另一个可以编码的对象)。如果未提供此函数,则在遇到无法编码的对象时,将引发TypeError。
方法

.encode(o): 将Python对象o编码为JSON字符串。

示例
代码语言:javascript
代码运行次数:0
运行
复制
import json  
  
# 创建一个JSONEncoder实例,配置美化输出  
encoder = json.JSONEncoder(indent=4, sort_keys=True)  
  
# 一个Python对象(字典)  
python_obj = {  
    'name': 'Alice',  
    'age': 25,  
    'is_student': False,  
    'courses': ['Math', 'Science', 'Art'],  
    'address': {  
        'street': '123 Main St',  
        'city': 'Wonderland'  
    }  
}  
  
# 将Python对象编码为JSON字符串  
json_str = encoder.encode(python_obj)  
  
# 打印JSON字符串  
print(json_str)

在这个示例中,我们创建了一个JSONEncoder实例,并通过indent和sort_keys参数配置了美化输出。然后,我们使用这个编码器的.encode()方法将一个Python对象(字典)编码为JSON字符串,并打印出来。

注意事项
  • 通常情况下,直接使用json.dumps()函数就足够了,因为它提供了与JSONEncoder相同的编码功能,但使用起来更简单。
  • 如果你需要处理大量的Python对象或需要重用编码器对象,那么使用JSONEncoder可能会更有效。
  • 在使用default参数时,请确保提供的函数能够正确处理无法编码的对象,并返回一个可以编码的对象。

json.JSONDecodeError 类

在Python的json模块中,json.JSONDecodeError是一个异常类,用于在解码(反序列化)JSON数据时报告错误。这个异常是在尝试将JSON格式的字符串转换为Python对象时,如果JSON数据格式不正确或无法解析,就会引发此异常。 json.JSONDecodeError是ValueError的一个子类,因此它继承了ValueError的所有属性和方法。此外,JSONDecodeError还提供了一些额外的属性,以帮助开发者诊断和修复解码过程中的问题。

属性
  • msg: 一个字符串,描述了错误的性质。这通常是一个简短的错误消息,如"Expecting value"或"Extra data"。
  • doc: 引发错误的JSON字符串(或其一部分)。这可以帮助你查看导致错误的具体JSON数据。
  • pos: 一个整数,表示错误发生的位置(在doc字符串中的索引)。这可以帮助你定位到JSON字符串中出错的具体位置。
  • lineno: 一个整数,表示错误发生的行号(如果JSON数据是分行的)。注意,这个属性可能不是所有Python版本或json模块实现中都可用。
  • colno: 一个整数,表示错误发生的列号(同样,如果JSON数据是分行的)。这个属性也可能不是所有实现中都可用。
示例
代码语言:javascript
代码运行次数:0
运行
复制
import json  
  
# 一个格式不正确的JSON字符串  
invalid_json = '{"name": "Alice", "age": 25, "is_student": '  
  
try:  
    # 尝试解码JSON字符串  
    data = json.loads(invalid_json)  
except json.JSONDecodeError as e:  
    # 捕获JSONDecodeError异常并打印错误信息  
    print(f"JSONDecodeError occurred: {e.msg}")  
    print(f"Error position: {e.pos} in document: {e.doc[:e.pos]}...")  
    # 如果可用,打印行号和列号  
    if hasattr(e, 'lineno'):  
        print(f"Error line number: {e.lineno}, column number: {e.colno}")

在这个示例中,我们尝试解码一个格式不正确的JSON字符串(缺少一个引号来闭合is_student的值)。由于JSON数据格式不正确,json.loads()函数会引发json.JSONDecodeError异常。我们捕获了这个异常,并打印了错误消息、错误位置以及(如果可用的话)行号和列号。

注意事项
  • 当处理来自外部源(如网络API、文件或用户输入)的JSON数据时,始终应该准备好捕获json.JSONDecodeError异常。
  • lineno和colno属性可能不是所有Python版本或json模块实现中都可用。如果你的环境中这些属性不可用,你可能需要依赖pos属性和错误消息来定位问题。
  • 在调试时,查看doc属性中的JSON数据可以帮助你理解为什么解码失败。但是,请注意,如果JSON数据非常大,打印整个字符串可能会占用大量空间或导致性能问题。在这种情况下,你可能只想打印出错位置附近的一部分数据。
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2024-10-29,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • Python中JSON的常用方法
    • json.loads()
      • 参数
      • 返回值
      • 示例
      • 注意事项
    • json.dumps()
      • 参数
      • 返回值
      • 示例
      • 注意事项
    • json.load()
      • 参数
      • 返回值
      • 示例
      • 注意事项
    • json.dump()
    • 参数
      • 返回值
      • 示例
      • 注意事项
    • json.JSONDecoder 类
      • 构造函数
      • 方法
      • 示例
      • 注意事项
    • json.JSONEncoder 类
      • 构造函数
      • 方法
      • 示例
      • 注意事项
    • json.JSONDecodeError 类
      • 属性
      • 示例
      • 注意事项
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档