You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.15 06:33:49