From: Standard JSON5
介绍JSON(JavaScript Object Notation),一种轻量级的数据交换格式,源于JavaScript,为ECMAScript的一个子集。其易于阅读和编写、易于编码和解析等特性,已被广泛应用于尤其配置及http下的序列化等众多方面。
JSON5是对JSON的扩展,其目的是能够让人们(程序猿)更加容易的阅读和编写。
按照官方介绍,JSON5相对于JSON增加了以下特性(优势) summary-of-features:
对象:
属性key可以不使用引号包含属性key可以使用单引号包含 { success: true, 'msg': "OK"}数组:
可以在尾部有多余逗号 [1, 2, 3, 4,]字符串:
可以以单引号包含支持多行字符串可以包含转义字符 { name: 'ManerFan', addr: 'KunMing Road, ShannXi, China', nickname: 'u5c0fu5e08u59b9'}数字:
可以使用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:' u4f60u597d 不要闹! ', array: [123_456_789_123_456_789_123_456, -0xABC_FFFF_FFFF_FFFF_FFFF] } }""".trimIndent().parseObject(Obj::class.java)更多示例见 json5-demo,欢迎围观
参考 Standard JSON5JSON for HumansGitHub - tnjson