淺談JSON5解決了JSON的兩大痛點(diǎn)
JSON 格式可以說(shuō)是目前最流行的數(shù)據(jù)傳輸格式了,被廣泛應(yīng)用于前后端通信,尤其是在 SPA 應(yīng)用中,JSON 數(shù)據(jù)通過(guò) HTTP 協(xié)議進(jìn)行傳輸,具有體積小、易序列化、可讀性好等優(yōu)點(diǎn)。(當(dāng)然,這些優(yōu)點(diǎn)是相對(duì)的,例如體積小是相對(duì)于 XML 而言的,如果跟 protobuf 比,那體積就大多了。)
JSON 雖好,但是仍有兩大痛點(diǎn)讓開(kāi)發(fā)者苦惱不已:
- 不能添加注釋?zhuān)ㄟ@個(gè)不能忍)
- 序列化之后的 key 被加上了雙引號(hào)(體積變大了)
如何添加注釋
目前的標(biāo)準(zhǔn)是不能添加注釋?zhuān)绻胩砑拥脑?huà),只能曲線(xiàn)救國(guó)了,例如我是這么干的:
{
"----------base----------": "通用模塊變量定義",
"common": {
"object_not_exit": "對(duì)象 ${id} 不存在!",
"invalid_username_or_password": "用戶(hù)名或密碼錯(cuò)誤!"
},
"----------sms----------": "短信模塊相關(guān)變量",
"sms": {
"template_missing_parameters": "模板缺少變量!",
"param_length_limit": "參數(shù)超出長(zhǎng)度限制!"
}
}
總結(jié)下來(lái)一般有下面三種方法:
1、使用約定的 key 作為注釋字段:
如以 //, _comment,#####,—--— (# 或 - 的個(gè)數(shù)自定) 作為注釋的 key 等。
2、使用重名 key 作為注釋?zhuān)?br /> 即每個(gè) key,使用兩次,第1次做注釋?zhuān)?次做實(shí)際屬性。
3、使用字段 key 加前綴做注釋 key:
常用的前綴有 #, _ 等。
能否去掉 key 中的雙引號(hào)
序列化之后的 key 被加上了雙引號(hào),例如:
const obj = { name: 'keliq', age: 12 }
console.log(JSON.stringify(obj))
// {"name":"keliq","age":12}
仔細(xì)觀(guān)察可以發(fā)現(xiàn),對(duì)象的 key 是沒(méi)有雙引號(hào)的,但是序列化之后,兩邊都被加上了引號(hào),導(dǎo)致字符數(shù)量變多了,那問(wèn)題就來(lái)了:
- 為什么要給 key 加雙引號(hào)?
- 能不能去掉 key 里面的雙引號(hào)?
這里先說(shuō)一個(gè)歷史背景:
在 ECMAScript 3 中,保留字是不能作為對(duì)象的 key 的,例如:
{function: 0} // 語(yǔ)法錯(cuò)誤
{if: 0} // 語(yǔ)法錯(cuò)誤
{true: 0} // 語(yǔ)法錯(cuò)誤
只能給 key 添加雙引號(hào)或單引號(hào):
{"function": 0} // Ok
{"if": 0} // Ok
{"true": 0} // Ok
但是在 ES5 之后,保留字也是可以作為 key 的了,因此在不考慮向后兼容的情況下,如果能把 JSON 對(duì)象表示成跟 JavaScript 對(duì)象一模一樣,只是把中間的空格、換行等刪掉該多好呀!
強(qiáng)大的 JSON5
你想要的,它都有!這就是 JSON5 標(biāo)準(zhǔn),它有以下特性:
對(duì)象
對(duì)象的 key 可以跟 JavaScript 中對(duì)象 key 完全一致
末尾可以有一個(gè)逗號(hào)
數(shù)組
末尾可以有一個(gè)逗號(hào)
字符串
- 字符串可以用單引號(hào)
- 字符串可以用反引號(hào)
- 字符串可以用轉(zhuǎn)義字符
數(shù)字
- 數(shù)字可以是 16 進(jìn)制
- 數(shù)字可以用點(diǎn)開(kāi)頭或結(jié)尾
- 數(shù)字可以表示正無(wú)窮、負(fù)無(wú)窮和NaN.
- 數(shù)字可以用加號(hào)開(kāi)頭
評(píng)論
支持單行和多行注釋
空格
允許多余的空格
可以看到,JSON5 比 JSON 強(qiáng)大很多,是 JSON 的超集,就好比 TypeScript 相較于 JavaScript。安裝方法為:
npm install json5 # 或者 yarn add json5
序列化示例:
const JSON5 = require('json5')
const obj = {
name: 'keliq',
age: 12,
}
const res = JSON5.stringify(obj)
console.log(res) // {name:'keliq',age:12}
反序列化示例:
const JSON5 = require('json5')
const json5str = `// 單行注釋
{
name:'keliq', // 這是姓名
age:12, /*這是年齡*/
}`
console.log(JSON5.parse(json5str))
看到這里,不禁感嘆,這才是 JSON 應(yīng)該有的樣子!你說(shuō)呢?
到此這篇關(guān)于淺談JSON5解決了JSON的兩大痛點(diǎn)的文章就介紹到這了,更多相關(guān)JSON5內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
web頁(yè)面數(shù)據(jù)展示新想法(json)
若使用json作為客戶(hù)端和服務(wù)器之間的數(shù)據(jù)交換格式,代替原來(lái)的html交換格式。2010-06-06
jQuery 遍歷json數(shù)組的實(shí)現(xiàn)代碼
看到網(wǎng)上有很多朋友問(wèn)遍歷json數(shù)組的代碼,腳本之家特為大家整理了一些,需要的朋友可以看下。2010-03-03
js解析與序列化json數(shù)據(jù)(三)json的解析探討
這一節(jié)我們主要討論json的解析,感興趣的朋友可以了解下,JSON.parse()方法也可以接收另一個(gè)參數(shù),該參數(shù)是一個(gè)函數(shù),將早每個(gè)鍵值對(duì)上調(diào)用,好了,話(huà)不多說(shuō),希望本文對(duì)你有所幫助2013-02-02
JSON.stringify 語(yǔ)法實(shí)例講解
可能有些人對(duì)系列化這個(gè)詞過(guò)敏,我的理解很簡(jiǎn)單。就是說(shuō)把原來(lái)是對(duì)象的類(lèi)型轉(zhuǎn)換成字符串類(lèi)型(或者更確切的說(shuō)是json類(lèi)型的)。就這么簡(jiǎn)單。打個(gè)比方說(shuō),你有一個(gè)類(lèi),那么你可以通過(guò)這個(gè)方法轉(zhuǎn)換成相應(yīng)的json類(lèi)型的2012-03-03
json實(shí)現(xiàn)前后臺(tái)的相互傳值詳解
這篇文章主要介紹了json實(shí)現(xiàn)前后臺(tái)的相互傳值詳解,需要的朋友可以參考下2015-01-01

