当前位置: 首页 > 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.gsyq.cn/news/1534751.html

相关文章:

  • EUREKA:大模型可编程评估框架与底层操作系统
  • 告别手动抢票:5步配置Autoticket自动化购票工具完整指南
  • RK3588全能芯实战指南:从AI部署到多屏显示与性能优化
  • 2026企业级AI大模型API选型:告别低价陷阱,聚焦稳定性工程化
  • 3步解锁微信聊天记录:本地数据备份与恢复的完整指南
  • 2026汕尾本地防雷检测哪家专业?TOP 正规机构榜单 + 防雷装置 + 接地电阻 + SPD 检测 附电话地址 - 中安检测集团
  • CentOS防火墙关闭指南:从firewalld操作到安全替代方案
  • Windows实现自然语言操控电脑的三大可行路径
  • BH1750环境光传感器:从I2C通信原理到嵌入式项目实战
  • 嵌入式系统总线仲裁与中断处理:MCU多主设备协同与实时响应机制详解
  • OpenCore Legacy Patcher完整指南:三步让旧Mac重获新生
  • AI实战能力成长地图:从论文扫盲到工程落地的6大能力层
  • 别再手写提示词了!一文读懂 AI 编程新范式:Loop Engineering(循环工程)
  • 国内专业的GEO管理系统有哪些?别急着要名单,先看这篇“鉴别指南”
  • DeepSeek内容优化完全指南:2026年AI引用型内容创作方法论与实战技巧 - GEORANK
  • NSK RA45AL 滚子直线导轨技术手册
  • 2026南京黄金回收测评 行情标准正规机构实力排名 - 开心测评
  • 3个实用技巧:用ComfyUI-Manager轻松管理你的AI绘画节点库
  • GPT-4o国内不可用原因与OpenAI兼容替代方案
  • 2026合肥黄金回收上门报价行情 避坑实用干货 - 余生黄金回收
  • 上门回收靠谱吗?沈阳五家名包回收平台服务细节全面测评 - 开心测评
  • Vue3 父组件引用子组件并控制子组件显隐及数据传递
  • 【雷达】调频连续波(FMCW)合成孔径雷达(SAR)模拟器附Matlab代码
  • 机器人多层陶瓷电容器(MLCC)
  • 航空常旅客计划:深度解析飞行活跃度暂停机制与权益保全策略
  • 用r²决定系数做股票市场相关性分析的实战方法
  • AMD Ryzen调试工具SMUDebugTool:免费开源的硬件性能终极指南
  • ClickHouse 物化视图优化:从查询加速到数据预聚合的工程实践
  • 枣庄薛城黄金变现指南 新手必学避坑技巧与正规门店盘点 - 铂衡汇黄金珠宝
  • 从Dareway案例解析个人品牌冷启动:定位、MVP与增长实战