JSON可以说是Web时代最通用的语言本文汇总Python生态下几个JSON处理库/框架。特点jsonPython内置orjson高性能json5支持JSON5格式jsonpatch性能较慢纯Python实现适合小数据量非常快C语言实现序列化快10倍反序列化快2倍较慢纯Python实现性能最低较慢序列化结果返回字符串str返回字节bytes需手动转字符串返回字符串str字符串支持数据类型基本Python类型dict、list、int等支持更多复杂类型dataclass、datetime、numpy等支持JSON5扩展语法注释、尾逗号、单引号等基本Python类型标准兼容性严格遵守JSON标准RFC 8259严格遵守JSON标准不支持NaN和Infinity支持JSON5扩展允许注释、NaN、Infinity等RFC 6902功能特点内置无需安装简单易用高性能适合大数据和复杂类型处理支持更灵活的JSON5格式适合配置文件JSON编辑、修改缺点性能较低功能有限返回bytes没文件读写接口需额外处理性能慢不适合性能敏感场景不适合性能敏感场景jsonPython内置模块简单易用适用如下场景适合小到中等数据量支持文件读写API简单直观性能一般序列化大数据时较慢无需安装直接看入门示例importjson data{name:张三,age:30,is_student:False}# 序列化为JSON字符串indent2美化格式ensure_asciiFalse支持中文json_strjson.dumps(data,ensure_asciiFalse,indent2)# 反序列化回Python对象data_backjson.loads(json_str)# 写入JSON文件withopen(data.json,w,encodingutf-8)asf:json.dump(data,f,ensure_asciiFalse,indent2)# 从文件读取JSONwithopen(data.json,r,encodingutf-8)asf:data_from_filejson.load(f)orjson基于Python和Rust的开源GitHub8.2K Star309 ForkJSON库相比标准json模块速度快3-10倍内存效率更高。建议在高性能Web应用和大规模数据处理场景中优先使用。核心优势在于其惊人的序列化速度API设计简洁直观。实战基于pip安装pip install orjson示例importorjson,datetime,numpy data{type:job,created_at:datetime.datetime(1970,1,1),status:,payload:numpy.array([[1,2],[3,4]]),}json_bytesorjson.dumps(data,optionorjson.OPT_NAIVE_UTC|orjson.OPT_SERIALIZE_NUMPY)orjson.loads(_)dumps方法直接返回bytes类型避免编码转换开销性能提升显著。反序列化同样快速支持各种数据类型的精确还原。json_datab{name: 李四, scores: [95, 87, 92]}parsed_dataorjson.loads(json_data)loads方法能够快速解析JSON字节数据恢复原始数据结构。完整支持Python主要数据类型包括datetime和UUIDfromdatetimeimportdatetime,datefromuuidimportuuid4 data{id:uuid4(),created_at:datetime.now(),birthday:date(1995,5,15),metadata:{version:1.0,active:True}}json_outputorjson.dumps(data)原生支持日期时间和UUID类型无需自定义序列化器。提供丰富的选项满足不同场景的性能需求data{message:性能测试,items:list(range(1000))}# 紧凑模式去除空白字符compact_jsonorjson.dumps(data,optionorjson.OPT_APPEND_NEWLINE)# 按Key排序确保输出一致性sorted_jsonorjson.dumps(data,optionorjson.OPT_SORT_KEYS)对比内置json模块的基准测试importorjsonimportjsonimporttime data{users:[{id:i,name:fuser_{i}}fori inrange(1000)]}# 标准json性能starttime.time()for_ inrange(1000):json.dumps(data)json_timetime.time()-start# orjson性能starttime.time()for_ inrange(1000):orjson.dumps(data)orjson_timetime.time()-startprint(f标准json:{json_time:.3f}秒)print(forjson:{orjson_time:.3f}秒)print(f性能提升:{json_time/orjson_time:.1f}倍)Web应用集成fromflaskimportFlask,Responseimportorjson appFlask(__name__)app.route(/api/users)defget_users():users[{id:1,name:张三,email:zhangexample.com},{id:2,name:李四,email:liexample.com}]json_dataorjson.dumps(users)returnResponse(json_data,mimetypeapplication/json)importorjsonimportnumpyasnpdefprocess_large_dataset():# 生成大型数据集large_data{matrix:np.random.rand(100,100).tolist(),timestamps:[f2024-01-{i:02d}fori inrange(1,32)]}# 快速序列化returnorjson.dumps(large_data)resultprocess_large_dataset()print(f序列化数据大小:{len(result)}字节)ujson开源GitHub4.5K Star386 Fork使用C编写、提供Python绑定的超快JSON处理库。核心技术C语言底层实现直接操作内存优化的编码/解码算法与标准json模块API完全兼容安装pip install ujson示例importujson data{name:Alice,age:30}json_strujson.dumps(data)dataujson.loads(json_str)# 支持高级选项json_strujson.dumps(data,ensure_asciiFalse,# 支持非ASCII字符escape_forward_slashesFalse,# 不转义正斜杠indent2# 格式化输出)simplejson开源GitHub1.7K Star354 Fork库官方文档。核心技术支持更多数据类型datetime、Decimal等更好的错误处理向后兼容标准库安装pip install simplejson示例fromsimplejsonimportdumps,RawJSON payload{status:ok,data:RawJSON({a: 1, b: 2})}dumps(payload)# 支持datetime序列化classDateTimeEncoder(json.JSONEncoder):defdefault(self,obj):ifisinstance(obj,datetime):returnobj.isoformat()returnsuper().default(obj)data{timestamp:datetime.now()}json_strjson.dumps(data,clsDateTimeEncoder)RapidJsonRapidJson是腾讯开源GitHub15.1K Star3.6K Fork使用C开发、同时提供SAX/DOM风格API的JSON处理库。核心技术C底层实现支持SIMD指令集优化内存池技术减少内存分配支持JSON指针和路径查询在Python生态下想使用RapidJson可通过包装器Wrapper来实现。python-rapidjsonPyPi最后一个版本1.23发布于25年12月7日对应开源GitHub533 Star53 Fork库。安装pip install python-rapidjson示例importrapidjson data{foo:100,bar:baz}dump_strrapidjson.dumps(data)rapidjson.loads(dump_str)# 自定义classStream:defwrite(self,data):print(Chunk:,data)rapidjson.dump(data,Stream(),chunk_size5)# 严格模式解析configrapidjson.ParseFlagNumbersAsStrings|rapidjson.ParseFlagValidateEncoding datarapidjson.loads(json_str,parse_modeconfig)# 生成带格式的JSONjson_strrapidjson.dumps(data,indent4,sort_keysTrue,ensure_asciiFalse)pyrapidjsonPyPi最后一个版本0.5.1发布于17年6月29日对应开源GitHub25 Star5 Fork库。安装pip install pyrapidjsonjson5对JSON5不了解可参考JSON衍生JSON5、JSONL、JSONC、NDJSON、BSON、JSONB、JSONP、HOCON。PyPi对应开源GitHub282 Star34 Fork库能力支持注释、尾逗号、单引号字符串、未加引号的键等JSON5特性。适合用作配置文件写起来更灵活方便。性能较慢不适合对速度要求高的场景。API和标准json非常类似容易上手。实战安装pip install json5示例importjson5 json5_text { // 这是注释 unquotedKey: 单引号字符串, trailingComma: true, // 尾逗号允许 } datajson5.loads(json5_text)json5_strjson5.dumps(data,indent2)如果JSON5格式不正确会抛出json5.JSON5Error异常。提供高级选项以满足更复杂的数据处理需求。比如可通过传递自定义的编码器和解码器类来改变json5的默认行为classCustomEncoder(json5.JSONEncoder):defencode(self,obj):# 自定义编码逻辑returnsuper().encode(obj)classCustomDecoder(json5.JSONDecoder):defdecode(self,obj):# 自定义解码逻辑returnsuper().decode(obj)encoderCustomEncoder()decoderCustomDecoder()encoded_dataencoder.encode(data)decoded_datadecoder.decode(encoded_data)jsonpatchJSON Patch一种用于描述对JSON文档所做更改的格式。它允许在只有部分数据发生变化时避免发送整个文档特别适用于HTTP PATCH方法可实现HTTP API的部分更新。JSON Patch文档本身也是JSON格式定义在IETF的RFC 6902中。JSON Patch包括原始文档、补丁和结果。假设原始文档{baz:qux,foo:bar}应用如下补丁[{op:replace,path:/baz,value:boo},{op:add,path:/hello,value:[world]},{op:remove,path:/foo}]结果是{baz:boo,hello:[world]}工作原理JSON Patch文档是一个包含一系列补丁操作的JSON数组。这些操作按顺序应用如果任何操作失败则整个补丁操作应中止。支持操作包括add向对象添加值或将其插入数组中remove从对象或数组中删除值replace替换值相当于先执行remove再执行addmove将值从一个位置移动到另一个位置copy将值从文档的一个位置复制到另一个位置test测试文档中的指定值是否与提供的值相等JSON Patch使用JSON Pointer来指定操作的目标位置。JSON Pointer是由/分隔的字符串用于指定对象中的键或数组中的索引。如果需要指向文档的根则使用空字符串。在Go生态下evanphx/json-patch可将patch应用到JSON文档上给出2个JSON文档自动计算差异生成patch。C中jsoncons内置对JSON Patch的支持。Python生态下推荐使用开源GitHub496 Star105 Fork库官方文档。实战基于pip安装pip install jsonpatch会一并安装jsonpointer路径解析库。示例太简单importjsonpatch original{baz:qux,foo:bar}patch[{op:replace,path:/baz,value:boo},{op:add,path:/hello,value:[world]},{op:remove,path:/foo}]# 应用patchpatchedjsonpatch.apply_patch(original,patch)print(json.dumps(patched,indent2))JsonPatch对象fromjsonpatchimportJsonPatch patchJsonPatch([{op:add,path:/new_key,value:new_value},{op:copy,from:/b,path:/copied_b}])doc{a:1,b:2}resultpatch.apply(doc)print(result)通过两个文档的diff生成Patchoriginal{a:1,b:2,c:[1,2,3]}target{a:1,b:3,c:[1,4]}# 生成diff patchpatchjsonpatch.make_patch(original,target)# 反向Patchreverse_patchpatch.reverse# 撤销修改revertedreverse_patch.apply(target)当patch操作无效如路径不存在、类型不匹配时会抛出JsonPatchException或JsonPointerExceptionimportjsonpatchfromjsonpatchimportJsonPatchExceptionfromjsonpointerimportJsonPointerException original{a:1}patch[{op:replace,path:/non_existent,value:2}]try:resultjsonpatch.apply_patch(original,patch)exceptJsonPointerExceptionase:print(路径错误,e)# 路径不存在exceptJsonPatchExceptionase:print(Patch错误,e)# 操作无效集成FlaskfromflaskimportFlask,request,jsonifyimportjsonpatch appFlask(__name__)# 模拟数据库中的资源data{id:1,name:Product,price:100}app.route(/products/1,methods[PATCH])defupdate_product():patchrequest.json# 客户端发送的patch数组try:globaldata datajsonpatch.apply_patch(data,patch)returnjsonify(data),200exceptExceptionase:returnjsonify({error:str(e)}),400if__name____main__:app.run(debugTrue)注意事项数组路径/users/-表示向数组末尾添加元素/users/0表示第一个元素原子性test操作可用于验证前置条件如版本号确保patch仅在数据未被修改时执行性能对于超大JSON文档建议使用流式处理或分段patch避免内存占用过高。