JSON5是什么?
JSON(JavaScript Object Notation),一种轻量级的数据交换格式,源于JavaScript,为ECMAScript的一个子集。其易于阅读和编写、易于编码和解析等特性,已被广泛应用于尤其配置及http下的序列化等众多方面。
JSON5是对JSON的扩展,其目的是能够让人们(程序猿)更加容易的阅读和编写。按照官方介绍,JSON5相对于JSON增加了以下特性(优势)
summary-of-features:https://spec.json5.org
对象:
属性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,欢迎围观
参考
未经允许请勿转载:程序喵 » JSON5 中文文档