什麼是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
相關文章
相關標籤/搜索