浅谈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 相关文章推荐
根据对象的某一属性进行排序的js代码(如:name,age)
Aug 10 Javascript
关于setInterval、setTimeout在jQuery中的使用注意事项
Sep 28 Javascript
poshytip 基于jquery的 插件 主要用于显示微博人的图像和鼠标提示等
Oct 12 Javascript
左右悬浮可分组的网站QQ在线客服代码(可谓经典)
Dec 21 Javascript
jquery获取css中的选择器(实例讲解)
Dec 02 Javascript
javascript中加号(+)操作符的一些神奇作用
Jun 06 Javascript
JS右下角广告窗口代码(可收缩、展开及关闭)
Sep 04 Javascript
JS原型链怎么理解
Jun 27 Javascript
浅谈JS中的三种字符串连接方式及其性能比较
Sep 02 Javascript
Javascript中判断一个值是否为undefined的方法详解
Sep 28 Javascript
解决VUE自定义拖拽指令时 onmouseup 与 click事件冲突问题
Jul 24 Javascript
vue切换菜单取消未完成接口请求的案例
Nov 13 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&MYSQL服务器配置说明
2006/10/09 PHP
详解WordPress中添加和执行动作的函数使用方法
2015/12/29 PHP
thinkphp多表查询两表有重复相同字段的完美解决方法
2016/09/22 PHP
php与python实现的线程池多线程爬虫功能示例
2016/10/12 PHP
thinkPHP5实现数据库添加内容的方法
2017/10/25 PHP
TNC vs IO BO3 第一场2.13
2021/03/10 DOTA
拖动Html元素集合 Drag and Drop any item
2006/12/22 Javascript
JavaScript与函数式编程解释
2007/04/27 Javascript
JavaScript 学习笔记(四)
2009/12/31 Javascript
GreyBox技术总结(转)
2010/11/23 Javascript
js将json格式内容转换成对象的方法
2013/11/01 Javascript
Knockout自定义绑定创建方法
2015/12/26 Javascript
js判断所有表单项不为空则提交表单的实现方法
2016/09/09 Javascript
dul无法加载bootstrap实现unload table/user恢复
2016/09/29 Javascript
详解Javascript数据类型的转换规则
2016/12/12 Javascript
详解vue-cli与webpack结合如何处理静态资源
2017/09/19 Javascript
Vue导出json数据到Excel电子表格的示例
2017/12/04 Javascript
layui上传图片到服务器的非项目目录下的方法
2019/09/26 Javascript
为react组件库添加typescript类型提示的方法
2020/06/15 Javascript
Python的subprocess模块总结
2014/11/07 Python
Python利用Beautiful Soup模块搜索内容详解
2017/03/29 Python
基于Python中capitalize()与title()的区别详解
2017/12/09 Python
python书籍信息爬虫实例
2018/03/19 Python
python实现梯度下降算法
2020/03/24 Python
详解Django中CBV(Class Base Views)模型源码分析
2019/02/25 Python
在Python中表示一个对象的方法
2019/06/25 Python
python3中pip3安装出错,找不到SSL的解决方式
2019/12/12 Python
python 画条形图(柱状图)实例
2020/04/24 Python
如何搭建pytorch环境的方法步骤
2020/05/06 Python
CSS3实现水平居中、垂直居中、水平垂直居中的实例代码
2020/02/27 HTML / CSS
俄罗斯香水在线商店:AromaCode
2019/12/04 全球购物
面临毕业的毕业生自荐书范文
2014/02/05 职场文书
故意杀人案辩护词
2015/05/21 职场文书
2016元旦文艺汇演主持词
2015/07/06 职场文书
学生会副主席竞选稿
2015/11/19 职场文书
SQL Server 中的事务介绍
2022/05/20 SQL Server