Json5 - 兼容json末位元素的多余逗号

json严格的末位元素不能带逗号的规定, 让我频繁需要更改元素顺序的时候麻烦又容易出错. 为了让我的python代码能兼容末位元素带逗号, 我使用了json5替代了json.


JSON5 的核心功能与用法

JSON5 是对 JSON 的超集扩展,旨在使其更易于人类读写。 纯 Python 库,无任何第三方依赖,非常轻量安全。

语法特性
* 末尾逗号:允许在对象和数组的最后一个元素后添加逗号(Trailing Commas)。
* 注释:支持单行(//)和多行(/* */)注释。但这个只读入, 不会写出.
* 引号放宽:Key 可以不加引号(只要是合法的标识符);允许使用单引号 ' 包裹字符串。
* 多行字符串:允许字符串通过反斜杠 \ 跨行。
* 数字增强:支持十六进制(0xFF)、正负号前缀(+1, -1.2)、小数点开头或结尾(.5, 1.)、InfinityNaN


Python 中 json5 库的读写行为

读入行为 (Robust Loading)

写出行为 (Consistent Dumping)

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"
  }
}