浅谈JSON5解决了JSON的两大痛点


Posted in Javascript onDecember 14, 2020

JSON 格式可以说是目前最流行的数据传输格式了,被广泛应用于前后端通信,尤其是在 SPA 应用中,JSON 数据通过 HTTP 协议进行传输,具有体积小、易序列化、可读性好等优点。(当然,这些优点是相对的,例如体积小是相对于 XML 而言的,如果跟 protobuf 比,那体积就大多了。)
JSON 虽好,但是仍有两大痛点让开发者苦恼不已:

  • 不能添加注释(这个不能忍)
  • 序列化之后的 key 被加上了双引号(体积变大了)

如何添加注释

目前的标准是不能添加注释,如果想添加的话,只能曲线救国了,例如我是这么干的:

{
 "----------base----------": "通用模块变量定义",
 "common": {
 "object_not_exit": "对象 ${id} 不存在!",
 "invalid_username_or_password": "用户名或密码错误!"
 },
 "----------sms----------": "短信模块相关变量",
 "sms": {
 "template_missing_parameters": "模板缺少变量!",
 "param_length_limit": "参数超出长度限制!"
 }
}

总结下来一般有下面三种方法:

1、使用约定的 key 作为注释字段:
如以 //, _comment,#####,—--— (# 或 - 的个数自定) 作为注释的 key 等。

2、使用重名 key 作为注释:
即每个 key,使用两次,第1次做注释,第2次做实际属性。

3、使用字段 key 加前缀做注释 key:
常用的前缀有 #, _ 等。

能否去掉 key 中的双引号

序列化之后的 key 被加上了双引号,例如:

const obj = { name: 'keliq', age: 12 }
console.log(JSON.stringify(obj))
// {"name":"keliq","age":12}

仔细观察可以发现,对象的 key 是没有双引号的,但是序列化之后,两边都被加上了引号,导致字符数量变多了,那问题就来了:

  • 为什么要给 key 加双引号?
  • 能不能去掉 key 里面的双引号?

这里先说一个历史背景:

在 ECMAScript 3 中,保留字是不能作为对象的 key 的,例如:
{function: 0} // 语法错误
{if: 0} // 语法错误
{true: 0} // 语法错误

只能给 key 添加双引号或单引号:
{"function": 0} // Ok
{"if": 0} // Ok
{"true": 0} // Ok

但是在 ES5 之后,保留字也是可以作为 key 的了,因此在不考虑向后兼容的情况下,如果能把 JSON 对象表示成跟 JavaScript 对象一模一样,只是把中间的空格、换行等删掉该多好呀!

强大的 JSON5

你想要的,它都有!这就是 JSON5 标准,它有以下特性:

对象

对象的 key 可以跟 JavaScript 中对象 key 完全一致
末尾可以有一个逗号

数组

末尾可以有一个逗号

字符串

  • 字符串可以用单引号
  • 字符串可以用反引号
  • 字符串可以用转义字符

数字

  • 数字可以是 16 进制
  • 数字可以用点开头或结尾
  • 数字可以表示正无穷、负无穷和NaN.
  • 数字可以用加号开头

评论

支持单行和多行注释

空格

允许多余的空格

可以看到,JSON5 比 JSON 强大很多,是 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 应该有的样子!你说呢?

到此这篇关于浅谈JSON5解决了JSON的两大痛点的文章就介绍到这了,更多相关JSON5内容请搜索三水点靠木以前的文章或继续浏览下面的相关文章希望大家以后多多支持三水点靠木!

Javascript 相关文章推荐
ASP SQL防注入的方法
Dec 25 Javascript
JS解决ie6下png透明的方法实例
Aug 02 Javascript
JQuery中extend使用介绍
Mar 13 Javascript
Javascript 读取操作Sql中的Xml字段
Oct 09 Javascript
javascript中replace使用方法总结
Mar 01 Javascript
jQuery导航条固定定位效果实例代码
May 26 jQuery
Angular 2父子组件数据传递之@Input和@Output详解(下)
Jul 05 Javascript
HTML5开发Kinect体感游戏的实例应用
Sep 18 Javascript
vue 组件中添加样式不生效的解决方法
Jul 06 Javascript
three.js搭建室内场景教程
Dec 30 Javascript
浅谈js中的attributes和Attribute的用法与区别
Jul 16 Javascript
浅谈vue使用axios的回调函数中this不指向vue实例,为undefined
Sep 21 Javascript
Vue实现点击当前行变色
Dec 14 #Vue.js
如何在JavaScript中等分数组的实现
Dec 13 #Javascript
使用Mock.js生成前端测试数据
Dec 13 #Javascript
javascript实现滚轮轮播图片
Dec 13 #Javascript
swiper实现导航滚动效果
Dec 13 #Javascript
swiperjs实现导航与tab页的联动
Dec 13 #Javascript
Vue实现简单购物车功能
Dec 13 #Vue.js
You might like
DC《神奇女侠2》因疫情推迟上映 温子仁新恐怖片《恶性》撤档
2020/04/09 欧美动漫
桌面中心(四)数据显示
2006/10/09 PHP
?生?D片??C字串
2006/12/06 PHP
php 全文搜索和替换的实现代码
2008/07/29 PHP
php函数的常用方法及注意之处小结
2011/07/10 PHP
PHP备份数据库生成SQL文件并下载的函数代码
2012/02/05 PHP
php、mysql查询当天,查询本周,查询本月的数据实例(字段是时间戳)
2017/02/04 PHP
filemanage功能中用到的common.js
2007/04/08 Javascript
js解析与序列化json数据(一)json.stringify()的基本用法
2013/02/01 Javascript
Nodejs学习笔记之NET模块
2015/01/13 NodeJs
javascript实现实时输出当前的时间
2015/04/27 Javascript
jQuery中(function($){})(jQuery)详解
2015/07/15 Javascript
Express+Nodejs 下的登录拦截实现代码
2017/07/01 NodeJs
Kindeditor单独调用单图上传增加预览功能的实例
2017/07/31 Javascript
微信上传视频文件提示(推荐)
2018/11/22 Javascript
微信小程序如何获取用户收货地址
2018/11/27 Javascript
layui 关闭open弹出框 刷新table表格页面的方法
2019/09/16 Javascript
[40:03]RNG vs VG 2019国际邀请赛小组赛 BO2 第二场 8.15
2019/08/17 DOTA
Python实现的插入排序算法原理与用法实例分析
2017/11/22 Python
Python2.7基于笛卡尔积算法实现N个数组的排列组合运算示例
2017/11/23 Python
python 批量修改/替换数据的实例
2018/07/25 Python
Python操作远程服务器 paramiko模块详细介绍
2019/08/07 Python
Airbnb爱彼迎官网:成为爱彼迎房东,赚取收入
2019/03/14 全球购物
TALLY WEiJL法国网上商店:服装、时装及配饰
2019/08/31 全球购物
商务英语大学生职业生涯规划书范文
2014/01/01 职场文书
销售员求职个人的自我评价
2014/02/19 职场文书
初中高效课堂实施方案
2014/02/26 职场文书
个人投资计划书
2014/05/01 职场文书
模具专业自荐信
2014/05/29 职场文书
服务标语口号
2014/07/01 职场文书
2014年会计人员工作总结
2014/12/10 职场文书
2015年科协工作总结
2015/05/19 职场文书
2015年科学教研组工作总结
2015/07/22 职场文书
运动会闭幕式致辞
2015/07/29 职场文书
python神经网络学习 使用Keras进行回归运算
2022/05/04 Python
Python时间操作之pytz模块使用详解
2022/06/14 Python