浅谈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操作Cookies的小例子
Oct 15 Javascript
JS实现静止元素自动移动示例
Apr 14 Javascript
javascript字符串替换函数如何一次性全部替换掉
Oct 30 Javascript
AngularJS基础 ng-class-odd 指令示例
Aug 01 Javascript
vue-router实现webApp切换页面动画效果代码
May 25 Javascript
jquery之基本选择器practice(实例讲解)
Sep 30 jQuery
微信小程序上传图片实例
May 28 Javascript
webpack优化的深入理解
Dec 10 Javascript
ES6 Generator函数的应用实例分析
Jun 26 Javascript
js实现图片3D轮播效果
Sep 21 Javascript
基于 Vue 的 Electron 项目搭建过程图文详解
Jul 22 Javascript
vue打包npm run build时候界面报错的解决
Aug 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中调用ASP.NET的WebService的代码
2011/04/22 PHP
jQuery $.data()方法使用注意细节
2012/12/31 Javascript
javascript游戏开发之《三国志曹操传》零部件开发(一)让静态人物动起来
2013/01/23 Javascript
JS动态获取当前时间,并写到特定的区域
2013/05/03 Javascript
jQuery实现form表单基于ajax无刷新提交方法详解
2015/12/08 Javascript
详解JavaScript基于面向对象之创建对象(2)
2015/12/10 Javascript
微信小程序 video组件详解
2016/10/25 Javascript
Node接收电子邮件的实例代码
2017/07/21 Javascript
基于Vue的移动端图片裁剪组件功能
2017/11/28 Javascript
分享ES6的7个实用技巧
2018/01/18 Javascript
vue-cli2.0转3.0之项目搭建的详细步骤
2018/12/11 Javascript
解决IOS端微信H5页面软键盘弹起后页面下方留白的问题
2019/06/05 Javascript
ant-design-vue中tree增删改的操作方法
2020/11/03 Javascript
python用来获得图片exif信息的库实例分析
2015/03/16 Python
Python OpenCV 直方图的计算与显示的方法示例
2018/02/08 Python
详解TensorFlow在windows上安装与简单示例
2018/03/05 Python
Python使用re模块正则提取字符串中括号内的内容示例
2018/06/01 Python
实例详解Python模块decimal
2019/06/26 Python
python openCV获取人脸部分并存储功能
2019/08/28 Python
python opencv圆、椭圆与任意多边形的绘制实例详解
2020/02/06 Python
django admin后管定制-显示字段的实例
2020/03/11 Python
Python %r和%s区别代码实例解析
2020/04/03 Python
TensorFlow的环境配置与安装方法
2021/02/20 Python
HTML5添加鼠标悬浮音响效果不使用FLASH
2014/04/23 HTML / CSS
AmazeUI框架搭建的方法步骤(图文)
2020/08/17 HTML / CSS
Kathmandu澳洲户外商店:新西兰户外运动品牌
2017/11/12 全球购物
GAP阿联酋官网:GAP UAE
2017/11/30 全球购物
英国经济型酒店品牌:Travelodge
2019/12/17 全球购物
中专自荐信
2013/10/13 职场文书
水利水电专业自荐信
2014/07/08 职场文书
2014年英语教学工作总结
2014/12/17 职场文书
超市督导岗位职责
2015/04/10 职场文书
离婚民事起诉状
2015/08/03 职场文书
2016年师德先进个人事迹材料
2016/02/29 职场文书
SQL Server中使用判断语句(IF ELSE/CASE WHEN )案例
2021/07/07 SQL Server
python装饰器代码解析
2022/03/23 Python