浅谈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 相关文章推荐
用Javascript实现锚点(Anchor)间平滑跳转
Sep 08 Javascript
jQuery 工具函数学习资料
Apr 29 Javascript
JavaScript中prototype为对象添加属性的误区介绍
Oct 15 Javascript
For循环中分号隔开的3部分的执行顺序探讨
May 27 Javascript
jQuery实现在下拉列表选择时获取json数据的方法
Apr 16 Javascript
js实现文字闪烁特效的方法
Dec 17 Javascript
jQuery mobile 移动web(4)
Dec 20 Javascript
jQuery检查元素存在性(推荐)
Sep 17 Javascript
详解Vue 非父子组件通信方法(非Vuex)
May 24 Javascript
关于vue中 $emit的用法详解
Apr 12 Javascript
javascript实现blob加密视频源地址的方法
Aug 08 Javascript
分享15个Webpack实用的插件!!!
Mar 31 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
PHP仿盗链代码
2012/06/03 PHP
PHP数据库操作之基于Mysqli的数据库操作类库
2014/04/19 PHP
PHP处理bmp格式图片的方法分析
2017/07/04 PHP
文本链接逐个出现的js脚本
2007/12/12 Javascript
JavaScript 事件属性绑定带参数的函数
2009/03/13 Javascript
使用ExtJS技术实现的拖动树结点
2010/08/05 Javascript
用Juery网页选项卡实现代码
2011/06/13 Javascript
jQuery向上遍历DOM树之parents(),parent(),closest()之间的区别
2013/12/02 Javascript
JavaScript作用域链示例分享
2014/05/27 Javascript
浅谈JavaScript Array对象
2014/12/29 Javascript
CSS图片响应式 垂直水平居中
2015/08/14 Javascript
跨域资源共享 CORS 详解
2016/04/26 Javascript
所见即所得的富文本编辑器bootstrap-wysiwyg使用方法详解
2016/05/27 Javascript
浅谈Jquery中Ajax异步请求中的async参数的作用
2016/06/06 Javascript
js面向对象编程总结
2017/02/16 Javascript
jQuery实现IE输入框完成placeholder标签功能的方法
2017/09/20 jQuery
JS/HTML5游戏常用算法之路径搜索算法 随机迷宫算法详解【普里姆算法】
2018/12/13 Javascript
Vue render函数实战之实现tabs选项卡组件
2019/04/22 Javascript
关于vue2强制刷新,解决页面不会重新渲染的问题
2019/10/29 Javascript
python实现基本进制转换的方法
2015/07/11 Python
Python爬虫运用正则表达式的方法和优缺点
2019/08/25 Python
python 通过手机号识别出对应的微信性别(实例代码)
2019/12/22 Python
django 模型中的计算字段实例
2020/05/19 Python
python palywright库基本使用
2021/01/21 Python
CSS3中文字镂空、透明值、阴影效果设置示例小结
2016/03/07 HTML / CSS
详解CSS3中使用gradient实现渐变效果的方法
2015/08/18 HTML / CSS
video结合canvas实现视频在线截图功能
2018/06/25 HTML / CSS
普通院校学生的自荐信
2013/11/27 职场文书
单位介绍信范文
2014/01/18 职场文书
矿泉水广告词
2014/03/20 职场文书
个人查摆剖析材料
2014/10/16 职场文书
教师岗位职责
2015/02/03 职场文书
《落花生》教学反思
2016/02/16 职场文书
预备党员的思想汇报,你真的会写吗?
2019/06/28 职场文书
读《人生的智慧》有感:闲暇是人生的精华
2019/12/25 职场文书
世界十大儿童漫画书排名,法国国宝漫画排第五,第二是轰动日本连环
2022/03/18 欧美动漫