json严格的末位元素不能带逗号的规定, 让我频繁需要更改元素顺序的时候麻烦又容易出错. 为了让我的python代码能兼容末位元素带逗号, 我使用了json5替代了json.
JSON5 的核心功能与用法
JSON5 是对 JSON 的超集扩展,旨在使其更易于人类读写。 纯 Python 库,无任何第三方依赖,非常轻量安全。
语法特性:
*
末尾逗号:允许在对象和数组的最后一个元素后添加逗号(Trailing
Commas)。
*
注释:支持单行(//)和多行(/* */)注释。但这个只读入,
不会写出.
* 引号放宽:Key
可以不加引号(只要是合法的标识符);允许使用单引号 '
包裹字符串。
* 多行字符串:允许字符串通过反斜杠 \
跨行。
*
数字增强:支持十六进制(0xFF)、正负号前缀(+1,
-1.2)、小数点开头或结尾(.5,
1.)、Infinity 和 NaN。
Python 中 json5 库的读写行为
读入行为 (Robust Loading)
- 兼容性极强:无论原始文件是标准
JSON(无逗号、有引号)、JSONC(带注释)还是
JSON5(带末尾逗号、单引号),
json5.load()都能统一读入。 - 无感处理:它不会因为原来没有逗号就报错,也不会因为原来有逗号就报错。
写出行为 (Consistent Dumping)
- 不维持原样:
json5库不会记忆原始文件的格式(比如原来哪里有空格,哪里没逗号)。 - 规则统一:写出时的格式完全由
dumps()的参数决定。
python中的最佳配置
只要在写出时开启 indent(缩进)参数,json5
默认会为你补全末尾逗号. 并且使用 quote_keys 参数,
让key带双引号尽量尊重原生json的格式.
import json5
# 即使输入是不带逗号的标准 JSON
raw_json = '{"name": "Alice", "tags": ["A", "B"]}'
data = json5.loads(raw_json)
# 写出时:
# 只要 indent 不为 None,json5 默认 trailing_commas 为 True
output = json5.dumps(data, indent=4, quote_keys=True)
print(output)输出效果:
{
"name": "Alice",
"tags": [
"A",
"B", // 自动生成的末尾逗号
], // 自动生成的末尾逗号
}
配置 VSCode 达到最佳兼容
VSCode类IDE 默认将 .json 文件视为严格的标准
JSON。要放宽限制(特别是允许末尾逗号不报错),最简单的做法:
针对单个项目将 JSON 关联为 JSONC
如果你想让项目内的所有 .json
文件都允许末尾逗号且支持注释,请在项目的
.vscode/settings.json 中配置:
{
"files.associations": {
"*.json": "jsonc"
}
}- 效果:VSCode 会将
.json识别为 “JSON with Comments”。不用更改扩展名. - 注意:它依然可能会给末尾逗号一个浅色的“警告”提示(因为标准 JSON 不建议),但不会再显示红色错误,也不会阻碍格式化。