基于文本,优于轻量,用于交换数据——json解析(上篇)
来源:互联网 发布:ipad壁纸 知乎 编辑:程序博客网 时间:2024/05/18 03:09
前言
1.首先,神马是json?
//这一行返回什么呢? var friend={ firstName: 'Teacher', 'lastName': 'Zhao', 'address': undefined, 'phone': ["1234567",undefined], 'fullName': function(){return this.firstName + ' ' + this.lastName;}};JSON.stringify(friend);
2.如果我想把最终JSON字符串中这个’friend’的姓名全部变成大写字母,也就是把”Teacher”变成”TEACHER”,把”Zhao”变成”ZHAO”,那么可以怎么做?
基于以上两个问题,我们再追本溯源问一下,JSON究竟是什么东西?为什么JSON就是易于数据交换?JSON和JS对象的区别?JS中JSON.parse、JSON.stringify和不常见的toJSON,这几个函数的参数和处理细节到底是怎样的?
欢迎进入本次“我们不止会New之深挖JSON之旅”,通过博主开发以来得拙见将从以下几个方面去理解JSON:
首先是对“JSON是一种轻量的数据交换格式”的理解;
然后来看经常被混为一谈的JSON和JS对象的区别;
最后我们再来看JS中这几个JSON相关函数具体的执行细节。
希望全文能让之前与我一样对JSON一知半解的老铁们能说清楚JSON是什么,也能熟练运用JSON,不看控制台就知道JS对象序列化成JSON字符串后输出是啥。
一、JSON是一种格式,基于文本,优于轻量,用于交换数据
如果没有去过JSON的官方介绍可以去一下这里,官方介绍第一、二段已经很清楚地表述了JSON是什么,我将JSON是什么提炼成以下几个方面:
1. 一种数据格式
什么是格式?就是规范你的数据要怎么表示,举个栗子,有个人叫“赵老师”,身高“180cm”,体重“70kg”,现在你要将这个人的这些信息传给别人或者别的什么东西,你有很多种选择:
- 姓名“赵老师”,身高“180cm”,体重“70kg”
- name=”赵老师”&height=”180cm”&weight=”70kg”
<person><name>赵老师</name><height>180</height><weight>70</weight></person
>- {“name”:”赵老师”,”height”:180,”weight”:70}
以上所有选择,传递的数据是一样的,但是你可以看到形式是可以各式各样的,这就是各种不同格式化后的数据,JSON是其中一种表示方式。
2. 基于文本的数据格式
JSON是基于文本的数据格式,相对于基于二进制的数据,所以JSON在传递的时候是传递符合JSON这种格式(至于JSON的格式是什么我们第二部分再说)的字符串,我们常会称为“JSON字符串”。
3. 轻量级的数据格式
在JSON之前,有一个数据格式叫xml,现在还是广泛在用,但是JSON更加轻量,如xml需要用到很多标签,像上面的例子中,你可以明显看到xml格式的数据中标签本身占据了很多空间,而JSON比较轻量,即相同数据,以JSON的格式占据的带宽更小,这在有大量数据请求和传递的情况下是有明显优势的。
4. 被广泛地用于数据交换
轻量已经是一个用于数据交换的优势了,但更重要的JSON是易于阅读、编写和机器解析的,即这个JSON对人和机器都是友好的,而且又轻,独立于语言(因为是基于文本的),所以JSON被广泛用于数据交换。
以前端JS进行ajax的POST请求为例,后端java处理请求为例:
前端构造一个JS对象,用于包装要传递的数据,然后将JS对象转化为JSON字符串,再发送请求到后端;
后端java通过ctrl接收到这个JSON字符串,将JSON字符串转化为java对象,然后处理请求。
可以看到,相同的数据在这里有3种不同的表现形式,分别是前端的JS对象、传输的JSON字符串、后端的java对象,我们看到JS对象和java对象明显不是一个东西,但是由于大家用的都是JSON来传递数据,大家都能理解这种数据格式,都能把JSON这种数据格式很容易地转化为自己能理解的数据结构,这就方便啦,在其他各种语言环境中交换数据都是如此。
二、JSON和JS对象之间的“攻守道”
很多时候都听到“JSON是JS的一个子集”这句话,而且这句话我曾经也一直这么认为,每个符合JSON格式的字符串你解析成js都是可以的,直到后来发现了一个奇奇怪怪的东西…
1. 两个本质不同的东西为什么那么密切
JSON和JS对象本质上完全不是同一个东西,就像“斑马线”和“斑马”,“斑马线”基于“斑马”身上的条纹来呈现和命名,但是斑马是活的,斑马线是非生物。
同样,”JSON”全名”JavaScript Object Notation”,所以它的格式(语法)是基于JS的,但它就是一种格式,而JS对象是一个实例,是存在于内存的一个东西。
开个笑话,如果JSON是基于Java的,可能就叫JAON了,形式可能就是这样的了['propertyOne = new foo', 'propertyTwo = new 42',]
,如果这样,那么JSON可能现在是和JAVA比较密切了。
此外,JSON是可以传输的,因为它是文本格式,但是JS对象是没办法传输的,在语法上,JSON也会更加严格,但是JS对象就很相比宽松一些了。
那么两个不同的东西为什么那么密切,因为JSON毕竟是从JS中演变出来的,语法相近。
2. JSON格式与JS对象语法表现上区别在哪
先就以“键值对为表现的对象”形式上,对比下两者的不同,至于JSON还能以怎样的形式表现,对比完后再罗列。
可以看到,相对于JS对象,JSON的格式更严格,所以大部分写的JS对象是不符合JSON的格式的。
以下举个栗子
var obj1 = {};// 这只是 JS 对象// 可把这个称做:JSON 格式的 JavaScript 对象 // 可把这个称做:JSON 格式的字符串var str1 = '{"width":100,"height":200,"name":"rose"}';// 这个可叫 JSON 格式的数组,是 JSON 的稍复杂一点的形式var arr = [ {"width":100,"height":200,"name":"rose"}, {"width":100,"height":200,"name":"rose"}, {"width":100,"height":200,"name":"rose"},];// 这个可叫稍复杂一点的 JSON 格式的字符串 var str2='['+'{"width":100,"height":200,"name":"rose"},'+'{"width":100,"height":200,"name":"rose"},'+'{"width":100,"height":200,"name":"rose"},'+']';
另外,除了常见的“正常的”JSON格式,要么表现为一个对象形式{…},要么表现为一个数组形式[…],任何单独的一个10进制数值、双引号字符串、布尔值和null都是有效符合JSON格式的。
3. 一个很有意思的地方,JSON不是JS的子集
首先看下面的代码,你可以copy到控制台执行下:
var code = '"\u2028\u2029"'; JSON.parse(code); // works fine eval(code); // fails
这两个字符\u2028和\u2029分别表示行分隔符和段落分隔符,JSON.parse可以正常解析,但是当做js解析时会报错。
各位老铁,上篇就到此结束了,大家可以在json语法规范中学习到更多json规范性得知识,如有问题请大家多多指正,我们不止会New!
- 基于文本,优于轻量,用于交换数据——json解析(上篇)
- 基于文本,优于轻量,用于交换数据——json解析(下篇)
- 文本数据交换格式:JSON
- JSON——基于javascript的轻量级数据交换格式
- Dapper.NET——轻量ORM
- Dapper.NET——轻量ORM
- Dapper.NET——轻量ORM
- CoreData 轻量数据升级
- CoreData 轻量数据升级
- Unity轻量数据保存
- 轻量级数据交换格式——JSON
- ISerializationCallbackReceiver接口的使用(用于解析JSON文本)
- 超轻JSON解析器
- wangEditor 基于javascript和css开发的 Web富文本编辑器, 轻量、简洁、易用、开源免费
- Java_JavaEE_轻量_Struts2数据校验流程;
- Android开发——WebView轻量缓存优化
- 用于解析Json数据的HttpUtils工具类
- 基于J2ME/J2EE的JSON数据交换的探讨
- 吴恩达Coursera深度学习课程 DeepLearning.ai 编程作业(4-2)
- Android O 8.0 通知(Notification)更新后的简单兼容写法
- 内核编译obj-m和obj-y的区别
- Python easyui的Layout
- Android使用友盟集成QQ、微信、微博等第三方登录
- 基于文本,优于轻量,用于交换数据——json解析(上篇)
- 对数据上传业务的一些总结
- Android自定义统计图(柱状图,折线图,饼状图)
- 数据结构--括号匹配检验
- cookie和session的区别
- C#编写串口程序(详细教程)
- 增强学习 比较好的入门文章
- 计算机网络中端到端与点到点的区别
- 在巨人的肩膀上(利用SDWebImage库再封装)