浅谈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 相关文章推荐
多广告投放代码 推荐
Nov 13 Javascript
Javascript代码混淆综合解决方案-Javascript在线混淆器
Dec 18 Javascript
artDialog 4.1.5 Dreamweaver代码提示/补全插件 附下载
Jul 31 Javascript
简单的ajax连接库分享(不用jquery的ajax)
Jan 19 Javascript
JavaScript中Null与Undefined的区别解析
Jun 30 Javascript
使用jQuery处理AJAX请求的基础学习教程
May 10 Javascript
jQuery简单获取DIV和A标签元素位置的方法
Feb 07 Javascript
浅谈Vue.js
Mar 02 Javascript
vue项目总结之文件夹结构配置详解
Dec 13 Javascript
详解vue中使用微信jssdk
Apr 19 Javascript
深入探索VueJS Scoped CSS 实现原理
Sep 23 Javascript
vue.js实现点击图标放大离开时缩小的代码
Jan 27 Vue.js
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 Try Catch异常测试
2009/03/01 PHP
PHP类中Static方法效率测试代码
2010/10/17 PHP
基于PHP5魔术常量与魔术方法的详解
2013/06/13 PHP
简单的php中文转拼音的实现代码
2014/02/11 PHP
php采集自中央气象台范围覆盖全国的天气预报代码实例
2015/01/04 PHP
使用PHP实现微信摇一摇周边红包
2016/01/04 PHP
jquery 最简单的属性菜单
2009/10/08 Javascript
jquery indexOf使用方法
2013/08/19 Javascript
JS delegate与live浅析
2013/12/21 Javascript
javascript实现选中复选框后相关输入框变灰不可用的方法
2015/08/11 Javascript
javascript中checkbox使用方法简单实例演示
2015/11/17 Javascript
详解Vue.js——60分钟组件快速入门(上篇)
2016/12/05 Javascript
layui文件上传实现代码
2017/05/20 Javascript
jQuery实现验证表单密码一致性及正则表达式验证邮箱、手机号的方法
2017/12/05 jQuery
JavaScript对象的浅拷贝与深拷贝实例分析
2018/07/25 Javascript
Python ORM框架SQLAlchemy学习笔记之关系映射实例
2014/06/10 Python
使用Python读写文本文件及编写简单的文本编辑器
2016/03/11 Python
使用Python编写基于DHT协议的BT资源爬虫
2016/03/19 Python
python从子线程中获得返回值的方法
2019/01/30 Python
深入浅析Python科学计算库Scipy及安装步骤
2019/10/12 Python
python3.6连接mysql数据库及增删改查操作详解
2020/02/10 Python
浅谈python3 构造函数和析构函数
2020/03/12 Python
Python测试框架:pytest学习笔记
2020/10/20 Python
Django+Django-Celery+Celery的整合实战
2021/01/20 Python
同程旅游英文网站:LY.com
2018/11/13 全球购物
电气自动化专业职业规划范文
2014/02/16 职场文书
机关党员2014全国两会学习心得体会
2014/03/10 职场文书
2014年高数考试作弊检讨书
2014/12/14 职场文书
小学音乐教师个人工作总结
2015/02/05 职场文书
2015年汽车销售经理工作总结
2015/04/27 职场文书
大学感恩节活动总结
2015/05/05 职场文书
环保宣传语大全
2015/07/13 职场文书
素质拓展训练感想
2015/08/07 职场文书
《桂花雨》教学反思
2016/02/19 职场文书
详解Java ES多节点任务的高效分发与收集实现
2021/06/30 Java/Android
MySQL自定义函数及触发器
2022/08/05 MySQL