JSON5 是对标准 JSON 的一种扩展,旨在让 JSON 更加宽松、易读、易写,尤其适合用作配置文件。它由 Aseem Kishore 等人在 2012 年发起,灵感来自 JavaScript 对象字面量的语法,目的是解决标准 JSON 在实际开发中过于严格、不便于手写的问题。
只要属性名是有效的 JavaScript 标识符,就可以省略引号。
{
foo: 1,
bar_baz: 2
}
字符串既可以用单引号 '
,也可以用双引号 "
。
{
name: '张三',
greeting: "Hello, world!"
}
支持 单行注释和 /* ... */
多行注释。
{
// 这是单行注释
foo: 1, /* 这是多行注释 */
bar: 2
}
对象和数组的最后一个元素后面可以有逗号。
{
foo: 1,
bar: 2, // 允许最后有逗号
}
可以写 0xFF
这样的十六进制数字,也支持科学计数法。
{
hex: 0xDEADBEEF,
big: 1.23e+45
}
使用反斜杠 \
允许字符串跨多行。
{
longString: '这是一个很长的字符串\
可以换行'
}
允许数字前有正负号、前导点等。
{
positive: +3,
negative: -7,
leadingDot: .5,
trailingDot: 2.,
}
JSON5 由 Aseem Kishore 和 Michael Bolin 等人于 2012 年发起,最初是为了解决标准 JSON 在配置文件和数据交换中的一些不便之处。标准 JSON 语法严格,不能加注释、属性名必须加引号、不能有结尾逗号等,这些在实际开发中常常带来困扰。JSON5 借鉴了 JavaScript 对象字面量的灵活性,允许更自然地书写数据结构。
.babelrc
, tsconfig.json5
, webpack.config.json5
等,便于开发者手写和维护。标准 JSON:
{
"name": "Alice",
"age": 25,
"languages": ["JavaScript", "TypeScript"]
}
JSON5:
// 用户信息
{
name: 'Alice', // 用户名
age: 25, // 年龄
languages: [ // 编程语言
'JavaScript',
'TypeScript', // 允许结尾逗号
],
hexId: 0x1234ABCD, // 十六进制ID
}
{
// 支持多种类型
user: {
id: 1001,
name: 'Bob',
isActive: true,
// 支持科学计数法
balance: 1.23e5,
// 支持多行字符串
description: '这是一段\
多行字符串',
// 支持嵌套对象和数组
tags: [
'admin',
'editor',
],
// 支持注释
/* 这里是多行注释 */
meta: {
created: '2023-01-01',
updated: '2024-01-01',
},
},
}
在 Node.js 或前端项目中,可以通过 npm 安装 JSON5 解析库:
npm install json5
使用方法:
const JSON5 = require('json5');
const fs = require('fs');
const data = fs.readFileSync('config.json5', 'utf8');
const config = JSON5.parse(data);
console.log(config);
JSON.parse
解析。