如何在Python中实现离线JSON修复与格式化工具?
修复格式错误的类JSON字符串并生成合法JSON
针对格式有缺陷的类JSON字符串,仅依赖json.loads的错误修复逻辑覆盖场景有限,更可靠的方式是通过正则提取键值对后重构合法JSON。以下是实现方案:
核心思路
- 用正则匹配所有
"键":值格式的键值对,覆盖字符串(含转义字符)、布尔值、数字、空字符串等常见值类型 - 将提取的键值对转换为Python字典
- 利用
json.dumps生成标准JSON格式
实现代码
import json import re def fix_and_parse_class_json(raw_str): # 匹配键值对的正则:键是双引号包裹的字符串,值支持布尔、数字、空字符串、带转义的字符串 pattern = r'"([^"\\]*(?:\\.[^"\\]*)*)":\s*(true|false|null|\d+|"(?:\\.|[^"\\])*"|)' matches = re.findall(pattern, raw_str) result_dict = {} for key, value in matches: # 处理值的类型转换 if value == 'true': parsed_value = True elif value == 'false': parsed_value = False elif value == 'null': parsed_value = None elif value.isdigit(): parsed_value = int(value) elif value.startswith('"') and value.endswith('"'): # 去除首尾引号并处理转义 parsed_value = value[1:-1].encode('utf-8').decode('unicode_escape') else: parsed_value = value # 空字符串等情况 result_dict[key] = parsed_value # 生成格式化的合法JSON return json.dumps(result_dict, indent=2, ensure_ascii=False) # 测试示例 raw_data = '''{"PSInstall":false,"DeviceID":"","RootBlock":false,"MobileData":false,"ExpireDate":1669794843523,"Message":"Follow me on telegram\nhttps:\/\/t.me\/channel\nFollow me on YouTube\nhttps:\/\/youtube.com\/channel\/channel","Payload":"www.example.com","SSLProxy":"","isDirect":false,"isSSL":true,"isSSLProxy":false,"isWS":true,"isDNS":false,"Server":""}''' print(fix_and_parse_class_json(raw_data))
说明
- 该方案能处理大部分常见的类JSON格式问题:比如缺失逗号、引号不完整(部分场景)、多余空白等
- 正则表达式覆盖了JSON中常见的值类型,包括带转义字符的字符串(如示例中的换行和斜杠转义)
- 最终生成的JSON完全符合标准格式,可直接被
json.loads解析
原代码的局限性
原代码仅处理了逗号和冒号缺失的单一错误场景,对于引号不闭合、转义错误、值类型解析错误等情况无法处理,而正则提取的方式更灵活,能覆盖更多格式缺陷场景。
内容的提问来源于stack exchange,提问作者Max Escorpion
相关产品推荐
相关产品推荐

