它基于JavaScript(Standard ECMA-262 3rd Edition - December 1999)的一个子集。
JSON采纳完整独立于言语的文本花样,然则也运用了类似于C言语家属的习气(包括C, C++, C#, Java, JavaScript, Perl, Python等)。
这些特征使JSON成为抱负的数据交换言语。 易于人浏览和编写,同时也易于机械剖析和生成(收集传输速率)。
JSON 语法
JSON 语法划定规矩
JSON 语法是 JavaScript 对象示意语法的子集。
数据在称号/值对中
数据由逗号分开
花括号保留对象
方括号保留数组
JSON 称号/值对
JSON 数据的誊写花样是:称号/值对。
称号/值对组合中的称号写在前面(在双引号中),值对写在背面(一样在双引号中),中心用冒号离隔:
"firstName":"John"
这很轻易明白,等价于这条 JavaScript 语句:
firstName="John"
JSON 值可所以:JSON 值
数字(整数或浮点数)
字符串(在双引号中)
逻辑值(true 或 false)
数组(在方括号中)
对象(在花括号中)
null
2基础构造
JSON构造有两种构造
json简朴说就是javascript中的对象和数组,所以这两种构造就是对象和数组两种构造,经由过程这两种构造可以示意种种庞杂的构造
1、对象:对象在js中示意为“{}”括起来的内容,数据构造为 {key:value,key:value,...}的键值对的构造,在面向对象的言语中,key为对象的属性,value为对应的属性值,所以很轻易明白,取值要领为 对象.key 猎取属性值,这个属性值的范例可所以 数字、字符串、数组、对象几种。
2、数组:数组在js中是中括号“[]”括起来的内容,数据构造为 ["java","javascript","vb",...],取值体式格局和统统言语中一样,运用索引猎取,字段值的范例可所以 数字、字符串、数组、对象几种。
经由对象、数组2种构造就可以组合成庞杂的数据构造了。
3基础示例
简朴地说,JSON 可以将 JavaScript 对象中示意的一组数据转换为字符串,然后就可以在函数之间轻松地通报这个字符串,或许在异步运用顺序中将字符串从 Web 客户机通报给服务器端顺序。这个字符串看起来有点儿离奇,然则JavaScript很轻易诠释它,而且 JSON 可以示意比"称号 / 值对"更庞杂的构造。比方,可以示意数组和庞杂的对象,而不仅仅是键和值的简朴列表。
称号 / 值对
根据最简朴的情势,可以用下面如许的 JSON 示意"称号 / 值对":
"firstName":"Brett"}
这个示例异常基础,而且现实上比等效的纯文本"称号 / 值对"占用更多的空间:
firstName=Brett
然则,当将多个"称号 / 值对"串在一起时,JSON 就会体现出它的价值了。起首,可以竖立包括多个"称号 / 值对"的 纪录,比方:
{"firstName":"Brett","lastName":"McLaughlin","email":"aaaa"}
示意数组从语法方面来看,这与"称号 / 值对"对比并没有很大的上风,然则在这类情况下 JSON 更轻易运用,而且可读性更好。比方,它明确地示意以上三个值都是统一纪录的一部份;花括号使这些值有了某种联络。
当须要示意一组值时,JSON 不只可以进步可读性,而且可以削减庞杂性。比方,假定您愿望示意一个人名列表。在XML中,须要许多最先标记和完毕标记;假如运用典范的称号 / 值对(就像在本系列前面文章中看到的那种称号 / 值对),那末必需竖立一种专有的数据花样,或许将键称号修正成 person1-firstName如许的情势。
假如运用 JSON,就只需将多个带花括号的纪录分组在一起:
{ "people":[ {"firstName":"Brett","lastName":"McLaughlin","email":"aaaa"}, {"firstName":"Jason","lastName":"Hunter","email":"bbbb"}, {"firstName":"Elliotte","lastName":"Harold","email":"cccc"} ] }
这不难明白。在这个示例中,只要一个名为 people的变量,值是包括三个条目的数组,每一个条目是一个人的纪录,个中包括名、姓和电子邮件地址。上面的示例演示如何用括号将纪录组合成一个值。固然,可以运用雷同的语法示意多个值(每一个值包括多个纪录):
{"programmers":[ {"firstName":"Brett","lastName":"McLaughlin","email":"aaaa"}, {"firstName":"Jason","lastName":"Hunter","email":"bbbb"}, {"firstName":"Elliotte","lastName":"Harold","email":"cccc"} ], "authors":[ {"firstName":"Isaac","lastName":"Asimov","genre":"sciencefiction"}, {"firstName":"Tad","lastName":"Williams","genre":"fantasy"}, {"firstName":"Frank","lastName":"Peretti","genre":"christianfiction"} ], "musicians":[ {"firstName":"Eric","lastName":"Clapton","instrument":"guitar"}, {"firstName":"Sergei","lastName":"Rachmaninoff","instrument":"piano"} ]}
在处置惩罚 JSON 花样的数据时,没有须要恪守的预定义的束缚。所以,在一样的数据构造中,可以转变示意数据的体式格局,以至可以以差别体式格局示意统一事物。这里最值得注重的是,可以示意多个值,每一个值进而包括多个值。然则还应该注重,在差别的主条目(programmers、authors 和 musicians)之间,纪录中现实的称号 / 值对可以不一样。JSON 是完整动态的,许可在 JSON 构造的中心转变示意数据的体式格局。
4花样运用
控制了 JSON 花样以后,在 JavaScript 中运用它就很简朴了。JSON 是 JavaScript 原生花样,这意味着在 JavaScript 中处置惩罚 JSON 数据不须要任何特别的 API 或东西包。
赋值给变量
比方,可以竖立一个新的 JavaScript 变量,然后将 JSON 花样的数据字符串直接赋值给它:
var people={"programmers":[{"firstName":"Brett","lastName":"McLaughlin","email":"aaaa"}, {"firstName":"Jason","lastName":"Hunter","email":"bbbb"}, {"firstName":"Elliotte","lastName":"Harold","email":"cccc"} ], "authors":[ {"firstName":"Isaac","lastName":"Asimov","genre":"sciencefiction"}, {"firstName":"Tad","lastName":"Williams","genre":"fantasy"}, {"firstName":"Frank","lastName":"Peretti","genre":"christianfiction"} ], "musicians":[ {"firstName":"Eric","lastName":"Clapton","instrument":"guitar"}, {"firstName":"Sergei","lastName":"Rachmaninoff","instrument":"piano"} ]}
这异常简朴;people包括前面看到的 JSON 花样的数据。然则,这还不够,由于接见数据的体式格局好像还不显著。
接见数据
只管看起来不显著,然则上面的长字符串现实上只是一个数组;将这个数组放进 JavaScript变量以后,就可以很轻松地接见它。现实上,只需用点号示意法来示意数组元素。所以,要想接见 programmers 列表的第一个条目的姓氏,只需在 JavaScript 中运用下面如许的代码:
people.programmers[0].lastName;
下面是运用统一变量的几个示例。注重,数组索引是从零最先的。所以,这行代码起首接见 people变量中的数据;然后移动到称为 programmers的条目,再移动到第一个纪录([0]);末了,接见 lastName键的值。效果是字符串值 “McLaughlin”。
people.authors[1].genre//Valueis"fantasy" people.musicians[3].lastName//Undefined.Thisreferstothefourthentry,andthereisn'tone people.programmers[2].firstName//Valueis"Elliotte"
修正数据应用如许的语法,可以处置惩罚任何 JSON 花样的数据,而不须要运用任何分外的 JavaScript 东西包或 API。
正如可以用点号和方括号接见数据,也可以根据一样的体式格局轻松地修正数据:
?
people.musicians[1].lastName="Rachmaninov";
换回字符串在将字符串转换为 JavaScript 对象以后,就可以像如许修正变量中的数据。
最闭幕是,假如要处置惩罚大批 JavaScript 对象,那末 JSON 是一个好挑选,如许就可以轻松地将数据转换为可以在请求中发送给服务器端顺序的花样。
5详细情势
1、对象是一个无序的“‘称号/值’对”鸠合。[3]
(1)一个对象以“{”(左括号)最先,“}”(右括号)完毕。
(2)每一个“称号”后跟一个“:”(冒号);
(3)“‘称号/值’ 对”之间运用“,”(逗号)分开。(如图所示,图中示意数据的体式格局是类似非确定性自动机的情势,没学过编译道理的人,能够明白起来难题点,现实上也是正则表达式的情势。下同)
例子:示意人的一个对象:
{ "姓名":"大憨", "岁数":24 }
(1)一个数组以“[”(左中括号)最先,“]”(右中括号)完毕。2、数组是值(value)的有序鸠合。
(2)值之间运用“,”(逗号)分开。
例子:一组门生
{ "门生": [ {"姓名":"小明","岁数":23}, {"姓名":"大憨","岁数":24} ] }
申明:此Json对象包括了一个门生数组,而门生数组中的值又是两个Json对象。
3、值(value)可所以双引号括起来的字符串(string)、数值(number)、true、false、 null、对象(object)或许数组(array)。这些构造可以嵌套。
4、字符串(string)是由双引号围困的恣意数目Unicode字符的鸠合,运用反斜线转义。一个字符(character)即一个零丁的字符串(character string)。 字符串(string)与C或许Java的字符串异常类似。
5、数值(number)也与C或许Java的数值异常类似。撤除不曾运用的八进制与十六进制花样。撤除一些编码细节。
6观点比较
和XML的比较
可读性
JSON和XML的可读性可谓势均力敌,一边是浅易的语法,一边是范例的标签情势,很难分出输赢。
可扩大性
XML天生有很好的扩大性,JSON固然也有,没有什么是XML可以扩大而JSON却不能扩大的。不过JSON在Javascript主场作战,可以存储Javascript复合对象,有着xml不可对比的上风。
编码难度
XML有雄厚的编码东西,比方Dom4j、JDom等,JSON也有供应的东西。无东西的情况下,置信闇练的开辟人员一样能很快的写出想要的xml文档和JSON字符串,不过,xml文档要多许多构造上的字符。
解码难度
XML的剖析体式格局有两种:
一是经由过程文档模子剖析,也就是经由过程父标签索引出一组标记。比方:xmlData.getElementsByTagName("tagName"),然则如许是要在预先晓得文档构造的情况下运用,没法举行通用的封装。
别的一种要领是遍历节点(document 以及 childNodes)。这个可以经由过程递归来完成,不过剖析出来的数据仍旧是情势各别,每每也不能满足预先的请求。
通常如许可扩大的构造数据剖析起来肯定都很难题。
JSON也一样云云。假如预先晓得JSON构造的情况下,运用JSON举行数据通报简直是太美好了,可以写出很有效雅观可读性强的代码。假如你是地道的前台开辟人员,肯定会异常喜好JSON。然则假如你是一个运用开辟人员,就不是那末喜好了,毕竟xml才是真正的构造化标记言语,用于举行数据通报。
而假如不晓得JSON的构造而去剖析JSON的话,那简直是恶梦。费时辛苦不说,代码也会变得冗余拖拉,获得的效果也不尽人意。然则如许也不影响浩瀚前台开辟人员挑选JSON。由于json.js中的toJSONString()就可以看到JSON的字符串构造。固然不是运用这个字符串,如许仍旧是恶梦。经常使用JSON的人看到这个字符串以后,就对JSON的构造很明了了,就更轻易的操纵JSON。
以上是在Javascript中仅关于数据通报的xml与JSON的剖析。在Javascript土地内,JSON毕竟是主场作战,其上风固然要远远优胜于xml。假如JSON中存储Javascript复合对象,而且不晓得其构造的话,我置信许多顺序员也一样是哭着剖析JSON的。
除了上述以外,JSON和XML另有别的一个很大的区分在于有效数据率。JSON作为数据包花样传输的时刻具有更高的效力,这是由于JSON不像XML那样须要有严厉的闭合标签,这就让有效数据量与总数据包比大大提拔,从而削减一致数据流量的情况下,收集的传输压力[4] 。
实例比较
XML和JSON都运用构造化要领来标记数据,下面来做一个简朴的比较。
用XML示意中国部份省市数据以下:
<?xmlversion="1.0"encoding="utf-8"?> <country> <name>中国</name> <province> <name>黑龙江</name> <cities> <city>哈尔滨</city> <city>大庆</city> </cities> </province> <province> <name>广东</name> <cities> <city>广州</city> <city>深圳</city> <city>珠海</city> </cities> </province> <province> <name>台湾</name> <cities> <city>台北</city> <city>高雄</city> </cities> </province> <province> <name>新疆</name> <cities> <city>乌鲁木齐</city> </cities> </province> </country>
用JSON示意以下:
{ "name":"中国", "province":[{"name":"黑龙江","cities":{"city":["哈尔滨","大庆"]}}, {"name":"广东","cities":{"city":["广州","深圳","珠海"]}}, {"name":"台湾","cities":{"city":["台北","高雄"]}}, {"name":"新疆","cities":{"city":["乌鲁木齐"]}} ] }
编码的手写难度来讲,xml照样惬意一些,好读固然就好写。不过写出来的字符JSON就显著少许多。去掉空缺制表以及换行的话,JSON就是密密层层的有效数据,而xml却包括许多反复的标记字符。编码的可读性,xml有显著的上风,毕竟人类的言语更切近如许的申明构造。json读起来更像一个数据块,读起来就比较费解了。不过,我们读起来费解的言语,恰恰是合适机械浏览,所以经由过程json的索引.province[0].name就可以读取“黑龙江”这个值。
7校验东西
媒介
JSON花样庖代了xml给收集传输带来了很大的轻易,然则却没有了xml的一览无余,尤其是json数据很长的时刻,我们会堕入烦琐庞杂的数据节点查找中。
然则国人的一款在线东西 BeJson 给浩瀚顺序员带来了一阵冷风。
功用
1 JSON花样化校验
许多人在获得JSON数据后,一时没有办法推断JSON数据花样是不是正确,是不是少或多标记而致使顺序不能剖析,这个功用正好能协助人人来完成JSON花样的校验。
2 JSON视图
想必许多顺序员都邑碰到当找一个节点的时刻,会发明假如直接对着一行行数据无从下手,就算晓得哪一个位置,还要一个节点一个节点的往下找,万一一不留神又得从头最先找的贫苦事。
有了这个功用,统统JSON数据都邑变成视图花样,一览无余,什么对象下有若干数组,一个数组下有若干对象。
这个功用异常有效。不光有视图功用另有花样化、紧缩、转义、校验功用。总之很壮大。
3 紧缩转义
顺序员在写JSON语句测试用例的时刻,许多时刻为了轻易直接写了个JSON字符串做测试,然则又堕入了无尽头的双引号转义的贫苦中。这款功用集紧缩、转义于一身,让你在写测试用例的时刻,瓮中之鳖。
4 JSON在线编辑器
假如你如今的电脑正巧没有装你所熟习的编辑器,假如你想针对拿到的JSON数据的某个节点做数据修正时,这个功用可以满足你的需求。
5 在线发送JSON数据
人人都晓得,JSON用的最多的照样web项目的开辟,那你要测试一个接口是不是能正确的接收JSON数据,那你就得写一个页面发送JSON字符串,反复的做着这件事。跟着这个功用的横空出世,你可以挣脱写测试页面了,由于这个功用可以将指定的JSON数据发送指定的url,轻易吧。
6 JSON着色
许多人在写文档时,总愿望文档能一览无余,然则面对着白底黑字的JSON数据老是提不起精力没紧要,运用这个功用,统统的关键字都[1] 会被着色,数据构造一览无余。
7 JSON-XML互转
望文生义,将JSON花样的数据转化成XML[1] 花样、或许XML花样的数据转化成JSON花样,统统都不是题目。
8 JSON-VIEW
JSON检察有效东西,在开辟过程当中(windows平台中)可以对JSON数据举行花样化和视图显现。
9 它和xml一样都是一种数据交换花样
以上就是猖獗XML进修笔记(4)------------XML的敌手 JSON 的内容,更多相关内容请关注ki4网(www.ki4.cn)!