Python中动态为无引号JSON键添加双引号的实现方案
解决无引号JSON键的正则动态替换方案
嘿,完全懂你现在的麻烦——手动逐个替换键名不仅低效,要是以后新增了键还得反复修改代码。其实我们可以用一个精准的正则表达式,自动识别所有符合JS对象属性名规则的无引号键,一次性给它们加上双引号,完美适配你给出的所有示例场景!
核心思路:精准匹配JSON键的正则模式
我们需要匹配的键具备以下特征:
- 位于对象起始符
{或者逗号,之后(可能伴随任意空格/换行) - 符合JS变量命名规则:以字母或下划线开头,后续可以是字母、数字、下划线
- 后面紧跟冒号
:(可能伴随任意空格/换行)
基于这个特征,我们可以写出这样的工具函数:
import re import json def fix_unquoted_json_keys(raw_str): # 正则匹配无引号的键并添加双引号 pattern = r'(?<=[{,]\s*)([a-zA-Z_][a-zA-Z0-9_]*)(?=\s*:)' fixed_str = re.sub(pattern, r'"\1"', raw_str) return fixed_str
正则各部分解析
(?<=[{,]\s*):正向预查,确保目标字符前面是{或,,且后面可以跟任意数量的空白字符(空格、换行、制表符等)([a-zA-Z_][a-zA-Z0-9_]*):捕获组,匹配符合JS变量名规则的键名(这也是你的示例中所有键的共同特征)(?=\s*:):正向预查,确保目标字符后面紧跟任意数量的空白字符和冒号:
测试你的所有示例
我们用你给出的四个测试案例来验证效果:
# 示例1:冒号后无空格 json_data1 = '[{storeName:"testName",address:"12345 Road",address2:"Suite 500",city:"testCity",storeImage:"http://www.testLink.com",state:"testState",phone:"999-999-9999",lat:99.9999,lng:-99.9999}]' fixed1 = fix_unquoted_json_keys(json_data1) print(json.loads(fixed1)) # 成功解析为JSON对象 # 示例2:冒号后有空格 json_data2 = '[{storeName: "testName",address: "12345 Road",address2: "Suite 500",city: "testCity",storeImage: "http://www.testLink.com",state: "testState",phone: "999-999-9999",lat: 99.9999,lng: -99.9999}]' fixed2 = fix_unquoted_json_keys(json_data2) print(json.loads(fixed2)) # 示例3:逗号后有空格 json_data3 = '[{storeName: "testName", address: "12345 Road", address2: "Suite 500", city: "testCity", storeImage: "http://www.testLink.com", state: "testState", phone: "999-999-9999", lat: 99.9999, lng: -99.9999}]' fixed3 = fix_unquoted_json_keys(json_data3) print(json.loads(fixed3)) # 示例4:含换行和空格 json_data4 = '''[ { storeName: "testName", address: "12345 Road", address2: "Suite 500", city: "testCity", storeImage: "http://www.testLink.com", state: "testState", phone: "999-999-9999", lat: 99.9999, lng: -99.9999 }]''' fixed4 = fix_unquoted_json_keys(json_data4) print(json.loads(fixed4))
所有示例都会被成功转换为有效的JSON字符串,并且可以通过json.loads()正常解析。
优势对比
和你之前手动逐个替换的方法相比,这个方案:
- 无需提前知道所有键名,动态识别所有符合规则的无引号键
- 适配各种空白字符(空格、换行、制表符)的组合场景
- 不会误匹配字符串值中的内容(比如
storeImage里的URL不会被修改)
内容的提问来源于stack exchange,提问作者Derrick Brewer
相关产品推荐
相关产品推荐

