Sublime宏无法处理JSON键值语义转换,因其仅记录按键动作、不理解JSON结构;可靠方案是Python脚本+Build System,支持嵌套、保留格式、报错明确。

宏不能直接处理 JSON 键值语义转换
Sublime 的宏只记录按键和光标动作,不理解 JSON 结构。你录下“选中 key → 按 Ctrl+Shift+P → 输入 convert case → 回车”这类操作,回放时会卡在命令面板没选中项、或因插件未加载而静默失败。它无法区分 "name" 是字段名还是字符串值,更不会自动把 user_name 转成 userName —— 这需要语义解析,不是机械回放能解决的。
常见误操作:用宏录一遍正则替换 _(\w) → \U$1,结果只在当前光标生效;或者录了 Find/Replace 面板操作,升级 Sublime 后按钮位置变、宏就失效。
- 宏只适合固定位置、固定长度、无嵌套的纯文本模式(比如每行末尾统一加
;) - JSON 键名常出现在对象开头、数组元素内部、多层嵌套中——宏无法自动定位这些位置
- 一旦 JSON 缩进不一致、含注释、或有换行字符串值,宏里的光标移动指令就会错位
真正可用的键值转换路径:Python 脚本 + Build System
本地写个 10 行 Python 脚本,比折腾宏靠谱得多。Sublime 可以把当前文件或选中文本传给它执行,输出结果直接插入或替换原内容。
示例脚本 snake_to_camel.py(存于 Packages/User/):
import json
import sys
import re
def snake_to_camel(s):
return re.sub(r'_([a-zA-Z])', lambda m: m.group(1).upper(), s)
try:
data = json.load(sys.stdin)
def walk(obj):
if isinstance(obj, dict):
return {snake_to_camel(k): walk(v) for k, v in obj.items()}
elif isinstance(obj, list):
return [walk(i) for i in obj]
else:
return obj
print(json.dumps(walk(data), indent=2, ensure_ascii=False))
except Exception as e:
print(f"JSON parse error: {e}", file=sys.stderr)
再配一个 Build System(Tools → Build System → New Build System):
{
"cmd": ["python", "-u", "$packages/User/snake_to_camel.py"],
"selector": "source.json",
"working_dir": "$file_path",
"encoding": "utf-8"
}
保存为 snake_to_camel.sublime-build,打开 JSON 文件后按 Ctrl+B 即可批量转换所有键名。
- 脚本可复用:改
snake_to_camel函数就能支持 kebab-case、UPPER_SNAKE 等任意映射 - 保留原始缩进、注释(若用
json5库)、字符串转义等完整语义 - 错误直接输出到 Sublime 控制台(
Ctrl+`),不用猜哪一行坏了
如果非要用宏,必须绕过 JSON 解析,只做局部安全替换
仅限非常规整、扁平、无嵌套的 JSON 片段,比如导出的 CSV 转 JSON 后的键名统一修正。此时要放弃“全自动”,手动预置光标位置,再用宏补位。
实操步骤:
- 先用正则
^(\s*)"([^"]+)":全选所有键名行(勾选. matches newline),再按Ctrl+Shift+L拆成多光标 - 按
Ctrl+Q开始录制:→ → →(跳过引号)→ → →(跳到冒号前),再按Ctrl+Shift+→选中键名,然后调用插件命令(如convert_case) - 停止录制后,检查生成的
.sublime-macro文件,删掉所有含"command": "show_panel"或"args": {"panel": "replace"}的行 - 绑定快捷键时,确保
context限定在source.json,避免误触发
注意:Ctrl+Shift+→ 在不同缩进下选区长度不同,若键名长度差异大(如 "id" vs "created_at_timestamp"),宏会漏字或吞字符。
别忽略编码和换行符这两个隐形破坏者
很多“转换后 JSON 无效”的问题,根本不是逻辑错,而是输入源带了 BOM 或混合了 \r\n 与 \n。Sublime 默认不报错,但 Python json.load() 会直接抛异常。
每次处理前务必确认:
- 菜单
File → Reopen with Encoding → UTF-8(不是 UTF-8 with BOM) - 菜单
File → Line Endings → Unix (LF),尤其 Windows 用户从 Excel 或邮件粘贴的数据 - 用
Ctrl+Shift+P → TrailingSpaces: Remove from current view清掉行尾空格,否则"key" : value会被误判为语法错误
这些步骤没法被宏记住,必须人工点一次 —— 这就是为什么看似“多一步”,实则省掉半小时调试时间。


















