百度360必应搜狗淘宝本站头条
当前位置:网站首页 > IT知识 > 正文

Python内置json模块:编码器和解码器详解

liuian 2025-09-04 11:53 17 浏览

知识图谱

1. JSON简介

JSON(JavaScript Object Notation)是一种轻量级的数据交换格式,易于人阅读和编写,同时也易于机器解析和生成。它基于JavaScript的一个子集,但JSON是完全独立于语言的文本格式。

1.1 JSON的特点

  • 轻量级:JSON的数据格式简洁,相比于XML等数据格式,JSON更加轻量。
  • 易读性:JSON的数据格式清晰,易于人阅读和理解。
  • 易解析:JSON的数据格式简单,易于机器解析和生成。
  • 语言无关:JSON是完全独立于语言的文本格式,几乎所有编程语言都支持JSON。

1.2 JSON的应用场景

  • 数据交换:JSON常用于Web应用中的数据交换,如前后端数据交互。
  • 配置文件:JSON也常用于配置文件,如Node.js中的配置文件。
  • API接口:JSON是RESTful API中最常用的数据格式。

2. Python中的json模块

Python的json模块提供了将Python对象编码为JSON格式的字符串,以及将JSON格式的字符串解码为Python对象的功能。

2.1 json模块的主要功能

  • 编码:将Python对象转换为JSON格式的字符串。
  • 解码:将JSON格式的字符串转换为Python对象。

2.2 json模块的常用函数

2.2.1 json.dumps()

功能:将Python对象编码为JSON格式的字符串。

原型

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:要序列化的Python对象。
  • skipkeys:如果为True,则跳过非基本类型的键。
  • ensure_ascii:如果为True,则输出保证对所有输入的非ASCII字符进行转义。
  • check_circular:如果为False,则跳过容器类型的循环引用检查。
  • allow_nan:如果为False,则对超范围的float值进行序列化将导致ValueError。
  • cls:自定义JSON编码器类。
  • indent:缩进级别,用于美化输出。
  • separators:分隔符元组,用于控制输出格式。
  • default:当对象无法被序列化时调用的函数。
  • sort_keys:如果为True,则字典输出将按键排序。

返回值:JSON格式的字符串。

示例

import json

data = {'name': 'Alice', 'age': 25, 'city': 'New York'}
json_str = json.dumps(data, indent=4)
print(json_str)

2.2.2 json.dump()

功能:将Python对象序列化为JSON格式的字符串,并写入文件。

原型

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:文件型对象,用于写入JSON数据。
  • 其他参数与json.dumps()相同。

返回值:无。

示例

import json

data = {'name': 'Alice', 'age': 25, 'city': 'New York'}
with open('data.json', 'w') as f:
    json.dump(data, f, indent=4)

2.2.3 json.loads()

功能:将JSON格式的字符串解码为Python对象。

原型

json.loads(s, *, cls=None, object_hook=None, parse_float=None, parse_int=None, parse_constant=None, object_pairs_hook=None, **kw)

参数

  • s:包含JSON数据的字符串。
  • cls:自定义JSON解码器类。
  • object_hook:当解码JSON对象时调用的函数。
  • parse_float:当解码JSON浮点数时调用的函数。
  • parse_int:当解码JSON整数时调用的函数。
  • parse_constant:当解码JSON常量时调用的函数。
  • object_pairs_hook:当解码JSON对象字面值时调用的函数。
  • 其他参数与json.load()相同。

返回值:Python对象。

示例

import json

json_str = '{"name": "Alice", "age": 25, "city": "New York"}'
data = json.loads(json_str)
print(data)

2.2.4 json.load()

功能:将JSON格式的字符串从文件中读取并解码为Python对象。

原型

json.load(fp, *, cls=None, object_hook=None, parse_float=None, parse_int=None, parse_constant=None, object_pairs_hook=None, **kw)

参数

  • fp:包含JSON数据的文件型对象。
  • 其他参数与json.loads()相同。

返回值:Python对象。

示例

import json

with open('data.json', 'r') as f:
    data = json.load(f)
print(data)

3. JSON编码器和解码器

3.1 json.JSONEncoder

功能:用于Python数据结构的可扩展JSON编码器。

原型

class json.JSONEncoder(*, skipkeys=False, ensure_ascii=True, check_circular=True, allow_nan=True, sort_keys=False, indent=None, separators=None, default=None)

参数

  • skipkeys:如果为False,则当尝试对非基本类型的键进行编码时将会引发TypeError。
  • ensure_ascii:如果为True,则输出保证将所有输入的非ASCII字符转义。
  • check_circular:如果为True,则列表、字典和自定义的已编码对象将在编码期间进行循环引用检查。
  • allow_nan:如果为True,则编码NaN、Infinity和-Infinity。
  • sort_keys:如果为True,则字典的输出是按照键排序。
  • indent:如果是一个非负整数或者字符串,那么JSON数组元素和对象成员会被美化输出为该值指定的缩进等级。
  • separators:如果指定,应该是一个(item_separator, key_separator)元组。
  • default:如果指定,其应该是一个函数,每当某个对象无法被序列化时它会被调用。

方法

  • default(o):在子类中实现这种方法使其返回o的可序列化对象,或者调用基础实现(引发TypeError)。
  • encode(o):返回Python o数据结构的JSON字符串表达方式。
  • iterencode(o):编码给定对象o,并且让每个可用的字符串表达方式。

示例

import json

class ComplexEncoder(json.JSONEncoder):
    def default(self, obj):
        if isinstance(obj, complex):
            return {'__complex__': True, 'real': obj.real, 'imag': obj.imag}
        return super().default(obj)

data = 1 + 2j
json_str = json.dumps(data, cls=ComplexEncoder)
print(json_str)

3.2 json.JSONDecoder

功能:简单的JSON解码器。

原型

class json.JSONDecoder(*, object_hook=None, parse_float=None, parse_int=None, parse_constant=None, strict=True, object_pairs_hook=None)

参数

  • object_hook:当解码JSON对象时调用的函数。
  • parse_float:当解码JSON浮点数时调用的函数。
  • parse_int:当解码JSON整数时调用的函数。
  • parse_constant:当解码JSON常量时调用的函数。
  • strict:如果为False,则控制字符将被允许在字符串内。
  • object_pairs_hook:当解码JSON对象字面值时调用的函数。

方法

  • decode(s):返回s的Python表示形式。
  • raw_decode(s):从s中解码出JSON文档,并返回一个Python表示形式为2元组以及指明该文档在s中结束位置的序号。

示例

import json

def as_complex(dct):
    if '__complex__' in dct:
        return complex(dct['real'], dct['imag'])
    return dct

json_str = '{"__complex__": true, "real": 1, "imag": 2}'
data = json.loads(json_str, object_hook=as_complex)
print(data)

4. 异常处理

4.1 json.JSONDecodeError

功能:拥有以下附加属性的ValueError的子类。

属性

  • msg:未格式化的错误消息。
  • doc:正在解析的JSON文档。
  • pos:解析失败的开始索引。
  • lineno:对应于pos的行。
  • colno:对应于pos的列。

示例

import json

try:
    json.loads('{"name": "Alice", "age": 25, "city": "New York"')
except json.JSONDecodeError as e:
    print(f"JSON解码错误: {e.msg}")
    print(f"错误位置: {e.pos}")
    print(f"错误行: {e.lineno}")
    print(f"错误列: {e.colno}")

5. 应用案例

5.1 案例1:配置文件读取与写入示例

场景:使用JSON格式存储配置文件,并在程序中读取和写入配置。

代码

import json

# 配置文件路径
config_file = 'config.json'

# 默认配置
default_config = {
    'host': 'localhost',
    'port': 8080,
    'debug': True
}

# 读取配置文件
def read_config():
    try:
        with open(config_file, 'r') as f:
            return json.load(f)
    except FileNotFoundError:
        return default_config

# 写入配置文件
def write_config(config):
    with open(config_file, 'w') as f:
        json.dump(config, f, indent=4)

# 示例
config = read_config()
print("当前配置:", config)

# 修改配置
config['port'] = 9090
write_config(config)
print("更新后的配置已写入文件")

5.2 案例2:复杂对象的JSON序列化示例

场景:将包含复杂对象(如自定义类实例)的数据结构序列化为JSON字符串。

代码

import json

class Person:
    def __init__(self, name, age):
        self.name = name
        self.age = age

class PersonEncoder(json.JSONEncoder):
    def default(self, obj):
        if isinstance(obj, Person):
            return {'name': obj.name, 'age': obj.age}
        return super().default(obj)

# 创建Person实例
person = Person('Alice', 25)

# 序列化为JSON字符串
json_str = json.dumps(person, cls=PersonEncoder, indent=4)
print(json_str)

# 反序列化
def person_decoder(dct):
    if 'name' in dct and 'age' in dct:
        return Person(dct['name'], dct['age'])
    return dct

person_data = json.loads(json_str, object_hook=person_decoder)
print(f"反序列化后的Person对象: name={person_data.name}, age={person_data.age}")

6. 学习结

6.1 学习路线

  1. 了解JSON的基本概念和应用场景
  2. 掌握Python中json模块的基本用法,包括json.dumps()json.dump()json.loads()json.load()
  3. 学习JSON编码器和解码器的使用,包括json.JSONEncoderjson.JSONDecoder
  4. 掌握异常处理,特别是json.JSONDecodeError的使用。
  5. 通过实际案例,如配置文件读取与写入、复杂对象的JSON序列化等,巩固所学知识。

6.2 学习总结

通过本教程,我们详细介绍了Python内置模块json的使用方法,包括JSON的基本概念、json模块的主要功能、JSON编码器和解码器的使用、异常处理以及实际应用案例。希望本教程能帮助你更好地理解和使用Python中的JSON处理功能。


持续更新Python编程学习日志与技巧,敬请关注!

相关推荐

搭建一个20人的办公网络(适用于20多人的小型办公网络环境)

楼主有5台机上网,则需要一个8口路由器,组网方法如下:设备:1、8口路由器一台,其中8口为LAN(局域网)端口,一个WAN(广域网)端口,价格100--400元2、网线N米,这个你自己会看了:)...

笔记本电脑各种参数介绍(笔记本电脑各项参数新手普及知识)

1、CPU:这个主要取决于频率和二级缓存,频率越高、二级缓存越大,速度越快,现在的CPU有三级缓存、四级缓存等,都影响相应速度。2、内存:内存的存取速度取决于接口、颗粒数量多少与储存大小,一般来说,内...

汉字上面带拼音输入法下载(字上面带拼音的输入法是哪个)

使用手机上的拼音输入法打成汉字的方法如下:1.打开手机上的拼音输入法,在输入框中输入汉字的拼音,例如“nihao”。2.根据输入法提示的候选词,选择正确的汉字。例如,如果输入“nihao”,输...

xpsp3安装版系统下载(windowsxpsp3安装教程)

xpsp3纯净版在采用微软封装部署技术的基础上,结合作者的实际工作经验,融合了许多实用的功能。它通过一键分区、一键装系统、自动装驱动、一键设定分辨率,一键填IP,一键Ghost备份(恢复)等一系列...

没有备份的手机数据怎么恢复

手机没有备份恢复数据方法如下1、使用数据线将手机与电脑连接好,在“我的电脑”中可以看到手机的盘符。  2、将手机开启USB调试模式。在手机设置中找到开发者选项,然后点击“开启USB调试模式”。  3、...

电脑怎么激活windows11专业版

win11专业版激活方法有多种,以下提供两种常用的激活方式:方法一:使用激活密钥激活。在win11桌面上右键点击“此电脑”,选择“属性”选项。进入属性页面后,点击“更改产品密钥或升级windows”。...

华为手机助手下载官网(华为手机助手app下载专区)

华为手机助手策略调整,已不支持从应用市场下载手机助手,目前华为手机助手是需要在电脑上下载或更新手机助手到最新版本,https://consumer.huawei.com/cn/support/his...

光纤线断了怎么接(宽带光纤线断了怎么接)

宽带光纤线断了可以重接,具体操作方法如下:1、光纤连接的时候要根据束管内,同色相连,同芯相连,按顺序进行连接,由大到小。一般有三种连接方法,分别是熔接、活动连接和机械连接。2、连接的时候要开剥光缆,抛...

深度操作系统安装教程(深度操作系统安装教程图解)
  • 深度操作系统安装教程(深度操作系统安装教程图解)
  • 深度操作系统安装教程(深度操作系统安装教程图解)
  • 深度操作系统安装教程(深度操作系统安装教程图解)
  • 深度操作系统安装教程(深度操作系统安装教程图解)
win7旗舰版和专业版区别(win7旗舰版跟专业版)

1、功能区别:Win7旗舰版比专业版多了三个功能,分别是Bitlocker、BitlockerToGo和多语言界面; 2、用途区别:旗舰版的功能是所有版本中最全最强大的,占用的系统资源,...

万能连接钥匙(万能wifi连接钥匙下载)

1、首先打开wifi万能钥匙软件,若手机没有开启WLAN,就根据软件提示打开WLAN开关;2、打开WLAN开关后,会显示附近的WiFi,如果知道密码,可点击相应WiFi后点击‘输入密码’连接;3、若不...

雨林木风音乐叫什么(雨林木风是啥)

雨林木风的创始人是陈年鑫先生。陈年鑫先生于1999年创立了雨林木风公司,其初衷是为满足中国市场对高品质、高性能电脑的需求。在陈年鑫先生的领导下,雨林木风以技术创新、产品质量和客户服务为核心价值,不断推...

aics6序列号永久序列号(aics6破解序列号)

关于AICS6这个版本,虽然是比较久远的版本,但是在功能上也是十分全面和强大的,作为一名平面设计师的话,AICS6的现有的功能已经能够应付几乎所有的设计工作了……到底AICC2019的功能是不是...

win7正在启动windows 卡住(win7正在启动windows卡住了 进入安全模式)
  • win7正在启动windows 卡住(win7正在启动windows卡住了 进入安全模式)
  • win7正在启动windows 卡住(win7正在启动windows卡住了 进入安全模式)
  • win7正在启动windows 卡住(win7正在启动windows卡住了 进入安全模式)
  • win7正在启动windows 卡住(win7正在启动windows卡住了 进入安全模式)
手机可以装电脑系统吗(手机可以装电脑系统吗怎么装)

答题公式1:手机可以通过数据线或无线连接的方式给电脑装系统。手机安装系统需要一定的技巧和软件支持,一般需要通过数据线或无线连接的方式与电脑连接,并下载相应的软件和系统文件进行安装。对于大部分手机用户来...