什么是JSON5以及JSON5的解析

The JSON5 Data Interchange Format is a proposed extension to JSON that aims to make it easier for humans to write and maintain by hand. It does this by adding some minimal syntax features directly from ECMAScript 5.1.

From: Standard JSON5java

介绍

JSON(JavaScript Object Notation),一种轻量级的数据交换格式,源于JavaScript,为ECMAScript的一个子集。其易于阅读和编写、易于编码和解析等特性,已被普遍应用于尤为配置及http下的序列化等众多方面。git

JSON5是对JSON的扩展,其目的是可以让人们(程序猿)更加容易的阅读和编写。
按照官方介绍,JSON5相对于JSON增长了如下特性(优点) summary-of-featuresgithub

对象spring

  • 属性key能够不使用引号包含
  • 属性key能够使用单引号包含
{
    success: true,
    'msg': "OK"
}

数组编程

  • 能够在尾部有多余逗号
[1, 2, 3, 4,]

字符串json

  • 能够以单引号包含
  • 支持多行字符串
  • 能够包含转义字符
{
    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的先后端应用。springboot

GitHub上搜索json5,各语言的repo数以下图编程语言

clipboard.png

因而,便萌生了编写解析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,欢迎围观

参考

  1. Standard JSON5
  2. JSON for Humans
  3. GitHub - tnjson
相关文章
相关标签/搜索