JSON5是什么?
JSON(JavaScript Object Notation),一种轻量级的数据交换格式,源于JavaScript,为ECMAScript的一个子集。其易于阅读和编写、易于编码和解析等特性,已被广泛应用于尤其配置及http下的序列化等众多方面。
JSON5是对JSON的扩展,其目的是能够让人们(程序猿)更加容易的阅读和编写。按照官方介绍,JSON5相对于JSON增加了以下特性(优势)
对象:属性key可以不使用引号包含
属性key可以使用单引号包含{
success: true,
'msg': "OK"
}
数组:可以在尾部有多余逗号[1, 2, 3, 4,]
字符串:可以以单引号包含
支持多行字符串
可以包含转义字符{
name: 'ManerFan',
addr: 'KunMing Road,\
ShannXi,\
China',
nickname: '\u5c0f\u5e08\u59b9'
}
数字:可以使用16进制表示
可以以小数点开头或结尾
支持 Infinity, -Infinity, NaN
可以显示声明 +{
intNum: +123,
doubleNum: -.25e2,
infNum: Infinity,
nanNum: NaN,
bigInt: 0x14FFFFFFFFFFFFFFFFFF
}
注释:支持单行/多行注释/**
* json5
* json for humans
*/
{
// 姓名
name: 'ManerFan',
sex: 'male' // 性别
}
解析
从编程语言方面讲,目前实现最为完善、维护最为频繁的还是js,目前json5已被广泛应用于NodeJS的前后端应用。在GitHub上搜索json5,各语言的repo数如下图
于是,便萌生了编写解析json5代码的想法参考tnjson,使用kotlin编写,已将代码开源至 manerfan-springboot-starter-json5
同时,在JSON5协议的基础上,对数字做了进一步扩展,支持使用下划线_对数字进行分隔{
// 整型
"intDec": +123_456, /* 10进制 */ intHex: 0x1a_FFfF, /* 16进制 */
// 长整型
longDec: 1_234_567_890, longHex: -0X1F_ffff_aBcD_EfeF,
// 浮点型
double1: .234, double2: +1.2e-2, double3: -5.6E3,
// 大整型
bigintDec: 123_456_789_123_456_789_123_456, bigintHex: -0xABC_FFFF_FFFF_FFFF_FFFF
}
有了kotlin语言的加持,便可以写出这样的语句"""
{
// 整型
"intDec": +123_456, /* 10进制 */ intHex: 0x1a_FFfF, /* 16进制 */
// 长整型
longDec: 1_234_567_890, longHex: -0X1F_ffff_aBcD_EfeF,
// 浮点型
double1: .234, double2: +1.2e-2, double3: -5.6E3,
// 大整型
bigintDec: 123_456_789_123_456_789_123_456, bigintHex: -0xABC_FFFF_FFFF_FFFF_FFFF
}
""".trimIndent().parseMap()"""
{
str: 'Hello Json5!',
num: -12_345,
doubleNum: .3e-2,
sub: {
str:'
\u4f60\u597d
不要闹!
',
array: [123_456_789_123_456_789_123_456, -0xABC_FFFF_FFFF_FFFF_FFFF]
}
}
""".trimIndent().parseObject(Obj::class.java)
更多示例见 json5-demo,欢迎围观
参考