什么是JSON5以及JSON5的解析

本文介绍了JSON5,它是对JSON的扩展,具有更易读写的特性,如对象属性key引号使用更灵活、数组可尾部有逗号等。在编程语言方面,js对其实现和维护较完善,还提到用kotlin编写解析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
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值