什么是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 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: '\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数如下图

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

订阅号

阅读 6.1k

推荐阅读
林中小舍
用户专栏

工作中的坑点及经验

51 人关注
41 篇文章
专栏主页