当前位置: 首页 > news >正文

Python json解码器底层实现

Python json模块解码器底层实现

json模块的JSONDecoder在CPython中用C实现(_json加速模块)。纯Python回退实现在json/decoder.py中。

JSONDecoder的扫描过程:

import json
from json.decoder import JSONDecoder

decoder = JSONDecoder()
result, idx = decoder.raw_decode('{"key": "value"} extra')
print(result) # {'key': 'value'}
print(idx) # 17(消耗的字符数)

raw_decode从指定位置开始解析,返回(解析结果,结束位置)。

decoder.scan_once是底层扫描函数。它通过一个大的switch语句处理不同的JSON token类型。

JSONEncoder的迭代编码:

encoder = json.JSONEncoder()
for chunk in encoder.iterencode({"key": "value"}):
print(chunk, end='')
# 逐步产生编码片段

iterencode用于流式编码大对象。

json.JSONEncoder的default方法处理不可序列化类型:

class CustomEncoder(json.JSONEncoder):
def default(self, obj):
if isinstance(obj, complex):
return {"__complex__": True, "real": obj.real, "imag": obj.imag}
if isinstance(obj, datetime.datetime):
return {"__datetime__": True, "value": obj.isoformat()}
if isinstance(obj, Decimal):
return str(obj)
return super().default(obj)

data = {"c": 3+4j, "d": Decimal("10.5")}
print(json.dumps(data, cls=CustomEncoder))

default在遇到不可序列化类型时被调用。如果default也无法处理,抛出TypeError。

object_hook和object_pairs_hook:

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

data = json.loads('{"val": {"__complex__": true, "real": 3, "imag": 4}}',
object_hook=as_complex)
print(data) # {'val': (3+4j)}

object_hook在每个JSON对象解码后调用。object_pairs_hook同样但接收有序键值对列表。

json.JSONEncoder的检查循环引用:

obj = {}
obj['self'] = obj
try:
json.dumps(obj)
except ValueError as e:
print(e) # Circular reference detected

JSONEncoder在编码时检测循环引用。通过_check_circular参数控制。

json.dumps的separators参数控制紧凑输出:

compact = json.dumps({"key": "value"}, separators=(',', ':'))
print(compact) # {"key":"value"}

默认separators=(', ', ': ')。compact版本去掉空格。

json.dump的ensure_ascii行为:

data = {"name": "中文"}
print(json.dumps(data)) # {"name": "中文"}
print(json.dumps(data, ensure_ascii=False)) # {"name": "中文"}

ensure_ascii=True时非ASCII字符被转义。False时输出原始Unicode。

sort_keys按键排序:

data = {"c": 3, "a": 1, "b": 2}
print(json.dumps(data, sort_keys=True)) # {"a": 1, "b": 2, "c": 3}

JSONDecoder的strict参数控制控制字符:

# strict=False允许控制字符(\x00-\x1f)
json.loads('{"key": "value\x00"}', strict=False)

json.tool命令行格式化:

# python -m json.tool input.json output.json

JSONDecodeError的详细信息:

try:
json.loads('{invalid}')
except json.JSONDecodeError as e:
print(f"Error at line {e.lineno}, col {e.colno}: {e.msg}")
print(f"Document: {e.doc}")
print(f"Position: {e.pos}")

http://www.jsqmd.com/news/1022888/

相关文章:

  • 2026石家庄全域代理记账注册公司代办机构TOP10 口碑优选推荐指南 - 品牌帮
  • 驻马店防水补漏哪家好?2026 优质榜单出炉,屋顶暗管漏水、飘窗地下室渗水、瓷砖空鼓修补专业防水公司推荐 - 泛家庭维修
  • 德州黄金回收行情参考 教你避开虚报高价回收套路 - 余生黄金回收
  • ViGEmBus虚拟手柄驱动:3步实现Windows游戏控制器完美兼容的终极方案
  • 告别手动抢票:5步配置Autoticket自动化购票工具完整指南
  • 2026景德镇黄金回收实测 靠谱门店与避坑指南 - 润富黄金回收
  • RK3588全能芯实战指南:从AI部署到多屏显示与性能优化
  • EUREKA:大模型可编程评估框架与底层操作系统
  • 2026企业级AI大模型API选型:告别低价陷阱,聚焦稳定性工程化
  • AMD推本地AI新机,2350亿参数离线跑
  • 3步解锁微信聊天记录:本地数据备份与恢复的完整指南
  • asyncio底层原理与生产级避坑指南
  • Obsidian入门实战:从空白界面到个人知识操作系统
  • 水处理设备全链条服务企业能力梳理 - 深度智识库
  • 打破60帧束缚:用开源工具解锁《原神》流畅新境界
  • 2026汕尾本地防雷检测哪家专业?TOP 正规机构榜单 + 防雷装置 + 接地电阻 + SPD 检测 附电话地址 - 中安检测集团
  • Lumafly:空洞骑士模组管理的终极解决方案,轻松管理300+模组
  • 2026年上海装修公司怎么选?别墅大宅、老房翻新、高端商业空间全案服务商深度对比指南 - 精选优质企业推荐官
  • CentOS防火墙关闭指南:从firewalld操作到安全替代方案
  • 阴阳师自动化脚本百鬼夜行智能控制终极指南:从零到精通的完整路径
  • 中资企业出海,为什么要找专业出海背调公司做背景调查? - 人力圈子
  • WechatDecrypt:三步实现微信聊天记录本地解密与数据主权回归
  • BH1750环境光传感器:从I2C通信原理到嵌入式项目实战
  • 挽回80万损失!进出口报关公司哪家好实战解析 - 热点速览
  • 如何快速掌握大麦网自动抢票神器:3倍成功率实战指南
  • 通用深拷贝扩展方法(C#)
  • 嵌入式系统总线仲裁与中断处理:MCU多主设备协同与实时响应机制详解
  • IoT设备同步配置分页问题修复
  • 国内好用的十款CRM系统软件排名 - 纷享销客智能型CRM
  • OpenCore Legacy Patcher完整指南:三步让旧Mac重获新生