浅谈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最新动画教程+iso光盘下载
Jan 22 Javascript
jQuery对于显示和隐藏等常用状态的判断方法
Dec 13 Javascript
jQuery实现按键盘方向键翻页特效
Mar 18 Javascript
jquery表单验证插件(jquery.validate.js)的3种使用方式
Mar 28 Javascript
javascript显示倒计时控制按钮的简单实现
Jun 07 Javascript
Bootstrap基本插件学习笔记之Alert警告框(20)
Dec 08 Javascript
jQuery中table数据的值拷贝和拆分
Mar 19 Javascript
JavaScript贪吃蛇小组件实例代码
Aug 20 Javascript
详解写好JS条件语句的5条守则
Feb 28 Javascript
JS实现图片轮播效果实例详解【可自动和手动】
Apr 04 Javascript
最简单的vue消息提示全局组件的方法
Jun 16 Javascript
vue 实现在同一界面实现组件的动态添加和删除功能
Jun 16 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 下 html5 XHR2 + FormData + File API 上传文件操作实例分析
2020/02/28 PHP
tp5.1 框架数据库高级查询技巧实例总结
2020/05/25 PHP
WordPress伪静态规则设置代码实例
2020/12/10 PHP
在线编辑器中换行与内容自动提取
2009/04/24 Javascript
javascript制作游戏开发碰撞检测的封装代码
2015/03/31 Javascript
JavaScript数组迭代器实例分析
2015/06/09 Javascript
JS+CSS实现的经典圆角下拉菜单效果代码
2015/10/21 Javascript
jQuery移动web开发之页面跳转和加载外部页面的实现
2015/12/04 Javascript
自己动手制作基于jQuery的Web页面加载进度条插件
2016/06/03 Javascript
ES6字符串模板,剩余参数,默认参数功能与用法示例
2017/04/06 Javascript
JS和JQuery实现雪花飘落效果
2017/11/30 jQuery
在Create React App中启用Sass和Less的方法示例
2019/01/16 Javascript
vue实现简单全选和反选功能
2020/09/15 Javascript
[02:25]DOTA2英雄基础教程 生死判决瘟疫法师
2013/12/06 DOTA
Python使用MySQLdb for Python操作数据库教程
2014/10/11 Python
最基础的Python的socket编程入门教程
2015/04/23 Python
Python入门之三角函数tan()函数实例详解
2017/11/08 Python
Python简单实现控制电脑的方法
2018/01/22 Python
python编写简易聊天室实现局域网内聊天功能
2018/07/28 Python
pandas 快速处理 date_time 日期格式方法
2018/11/12 Python
Python的log日志功能及设置方法
2019/07/11 Python
Python中的相关分析correlation analysis的实现
2019/08/29 Python
Python中关于浮点数的冷知识
2019/09/22 Python
Python 连接 MySQL 的几种方法
2020/09/09 Python
Python实现自动装机功能案例分析
2020/10/22 Python
python 窃取摄像头照片的实现示例
2021/01/08 Python
联想哥伦比亚网上商城:Lenovo Colombia
2017/01/10 全球购物
Java里面如何把一个Array数组转换成Collection, List
2013/07/26 面试题
《理想》教学反思
2014/02/17 职场文书
根叔历年演讲稿
2014/05/20 职场文书
2014年个人总结范文
2015/03/09 职场文书
2015年世界环境日演讲稿
2015/03/18 职场文书
商务司机岗位职责
2015/04/10 职场文书
CSS预处理框架——Stylus
2021/04/21 HTML / CSS
详解JS ES6编码规范
2021/05/07 Javascript
Oracle 多表查询基本语法实例
2022/04/18 Oracle