Python如何优雅解析Web服务返回的不完整JSON字符串?
不完整JSON解析优化方案
核心思路
你的输入字符串本质是标准JSON对象的内部键值对片段,仅缺失外层的{}包裹,无需做复杂的分割拼接操作,直接补全外层括号后用标准JSON库解析即可,容错性和可读性都远高于原有方案。
注意:如果你的实际接口返回的是经过HTML转义的字符串(包含
"这类转义符),先做HTML反转义再解析:import html x = html.unescape(x)
实现代码
方案1:直接解析为标准对象(更推荐)
绝大多数场景下这种键值对结构用对象格式更方便,一行即可完成解析:
import json x = '"1":{"name":"item one","code":"1"},"2":{"name":"item two","code":"2"},"3":{"name":"item three","code":"3"}' # 补全外层大括号后解析 data = json.loads(f"{{{x}}}")
解析结果:
{ "1": {"name": "item one", "code": "1"}, "2": {"name": "item two", "code": "2"}, "3": {"name": "item three", "code": "3"} }
可以直接用data["1"]的方式取值,比数组格式易用性更高。
方案2:输出和原有代码完全一致的数组格式
如果必须要和你之前的输出格式保持一致,解析完成后用列表推导转换即可:
import json x = '"1":{"name":"item one","code":"1"},"2":{"name":"item two","code":"2"},"3":{"name":"item three","code":"3"}' data = json.loads(f"{{{x}}}") # 转换为单键对象数组 res = [{k: v} for k, v in data.items()]
res的结果和你原有代码输出完全相同:
[ {'1': {'name': 'item one', 'code': '1'}}, {'2': {'name': 'item two', 'code': '2'}}, {'3': {'name': 'item three', 'code': '3'}} ]
原有方案的问题
你原来的字符串分割拼接方案容错性极低,一旦业务数据的字段值中出现},字符,整个解析逻辑就会出错,而本方案完全遵循JSON规范,不存在这类边界问题。
内容的提问来源于stack exchange,提问作者blizz
相关产品推荐
相关产品推荐

