浅谈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 建设银行登陆键盘
Jun 10 Javascript
jQuery实现的立体文字渐变效果
May 17 Javascript
jquery 定位input元素的几种方法小结
Jul 28 Javascript
jQuery学习笔记之jQuery动画效果
Sep 09 Javascript
JavaScript实现仿网易通行证表单验证
May 25 Javascript
jQuery简单实现验证邮箱格式
Jul 15 Javascript
AngularJS自定义插件实现网站用户引导功能示例
Nov 07 Javascript
java实现单链表增删改查的实例代码详解
Aug 30 Javascript
微信小程序录音实现功能并上传(使用node解析接收)
Feb 26 Javascript
Javascript表单序列化原理及实现代码详解
Oct 30 Javascript
JavaScript 实现轮播图特效的示例
Nov 05 Javascript
Canvas跟随鼠标炫彩小球的实现
Apr 11 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 中文和编码判断代码
2010/05/16 PHP
基于PHP导出Excel的小经验 完美解决乱码问题
2013/06/10 PHP
php数组去除空值函数分享
2015/02/02 PHP
浅析php如何实现App常用的秒发功能
2016/08/03 PHP
jQuery实用技巧必备(下)
2015/11/03 Javascript
JavaScript字符串删除重复字符的方法
2015/12/25 Javascript
Query常用DIV操作获取和设置长度宽度的实现方法
2016/09/19 Javascript
jQuery表格(Table)基本操作实例分析
2017/03/10 Javascript
bootstrap基本配置_动力节点Java学院整理
2017/07/14 Javascript
js中let和var定义变量的区别
2018/02/08 Javascript
详谈vue+webpack解决css引用图片打包后找不到资源文件的问题
2018/03/06 Javascript
详解vue的双向绑定原理及实现
2019/05/05 Javascript
js如何获取访问IP、地区、当前操作浏览器
2019/07/23 Javascript
通过js实现压缩图片上传功能
2020/02/25 Javascript
Nest.js 授权验证的方法示例
2021/02/22 Javascript
python编程线性回归代码示例
2017/12/07 Python
Python tornado队列示例-一个并发web爬虫代码分享
2018/01/09 Python
如何使用python爬虫爬取要登陆的网站
2019/07/12 Python
pytorch 使用单个GPU与多个GPU进行训练与测试的方法
2019/08/19 Python
适合Python初学者的一些编程技巧
2020/02/12 Python
python文件操作seek()偏移量,读取指正到指定位置操作
2020/07/05 Python
python 模拟登录B站的示例代码
2020/12/15 Python
CSS3 box-shadow属性实例详解
2020/06/19 HTML / CSS
西班牙创意礼品和小工具网上商店:Curiosite
2016/07/26 全球购物
美国娱乐和流行文化商品店:FYE
2017/09/14 全球购物
SOA面试题:如何在SOA中实现松耦合
2013/07/21 面试题
求职简历的自我评价怎样写好
2013/10/07 职场文书
护理专业个人求职简历的自我评价
2013/10/13 职场文书
秦兵马俑教学反思
2014/02/07 职场文书
一份创业计划书范文
2014/02/08 职场文书
十八大宣传标语
2014/10/09 职场文书
群众路线个人整改措施
2014/10/24 职场文书
《法国号》教学反思
2016/02/22 职场文书
PHP判断是否是json字符串
2021/04/01 PHP
科普 | 业余无线电知识-波段篇
2022/02/18 无线电
Android Studio实现简易进制转换计算器
2022/05/20 Java/Android