<p>一、Json的简单介绍</p><p>从结构上看,所有的数据最终都可以分成三种类型:</p><p>第一种类型是scalar(标量),也就是一个单独的string(字符串)或数字(numbers),比如&quot;北京&quot;这个单独的词。</p><p>第二种类型是sequence(序列),也就是若干个相关的数据按照一定顺序并列在一起,又叫做array(数组)或List(列表),比如&quot;北京,东京&quot;。</p><p>第三种类型是mapping(映射),也就是一个名/值对(Name/value),即数据有一个名称,还有一个与之相对应的值,这又称作hash(散列)或dictionary(字典),比如&quot;首都:北京&quot;。</p><p>JSON(JavaScript Object Notation) 是一种轻量级的数据交换格式,它的规则非常简单并且是有趣的:</p><p>1) 并列的数据之间用逗号(&quot;,&quot;)分隔。</p><p>2) 映射用冒号(&quot;:&quot;)表示。</p><p>3) 并列数据的集合(数组)用方括号(&quot;[]&quot;)表示。</p><p>4) 映射的集合(对象)用大括号(&quot;{}&quot;)表示。</p><p>按照这个规则可以作以下理解:</p><p>1.数组用&quot;[]&quot;创建,对象用&quot;{}&quot;创建,并且使用Json基本都是用[]或者{}创建的数组或对象,否则一个普通的字符串是没有意义的;</p><p>2.无论是数组还是对象,之间的元素都用&quot;,&quot;隔开;</p><p>3.对象内部,(属性的)名称和值用&quot;:&quot;隔开,并且必须要用&quot;:&quot;隔开,不可单独存在属性名或者值;</p><p>4.对象和数组可以互相嵌套,即数组中的一个元素可以是一个对象也可以是一个数组,同理对象中的一个属性的值可以是一个对象也可以是一个数组。</p><p>二、事例</p><pre class="brush:js;toolbar:false">1. varchina={beijing:{name:&quot;北京&quot;,area:&quot;16000&quot;,haidian:{name:&quot;海淀区&quot;}}, shanghai:{name:&quot;上海&quot;,area:&quot;10000&quot;,minhang:{name:&quot;闵行区&quot;}}}; alert(china.beijing.haidian.name); alert(china.shanghai.minhang.name); 分别弹出&quot;海淀区&quot;和&quot;闵行区&quot;。 2. varourcountry=[[&quot;北京市&quot;],[&quot;上海市&quot;],[&quot;合肥市&quot;,&quot;芜湖市&quot;,&quot;蚌埠市&quot;]]; alert(ourcountry[2][1]); 弹出&quot;芜湖市&quot;。 3. varzhongguo={provinces:[{name:&quot;北京&quot;,cities:[{name:&quot;北京市&quot;,quxian:[&quot;海淀区&quot;,&quot;朝阳区&quot;,&quot;东城区&quot;,&quot;西城区&quot;]}]}, {name:&quot;安徽省&quot;,cities:[{name:&quot;芜湖市&quot;,quxian:[&quot;繁昌县&quot;,&quot;芜湖县&quot;,&quot;南陵县&quot;,&quot;三山区&quot;]},{name:&quot;合肥市&quot;,quxian:[&quot;肥西县&quot;,&quot;蜀山区&quot;,&quot;庐阳区&quot;]}]}, &quot;湖北省&quot; ]}; varstr=&quot;中国:{\n&quot;; for(vari=0;i&lt;zhongguo.provinces.length;i++) { if(zhongguo.provinces.cities!=null) { str+=zhongguo.provinces.name+&quot;{&quot;; for(varj=0;j&lt;zhongguo.provinces.cities.length;j++) { if(zhongguo.provinces.cities[j]!=null) { str+=zhongguo.provinces.cities[j].name+&quot;{&quot;; for(vark=0;k&lt;zhongguo.provinces.cities[j].quxian.length;k++) { str+=zhongguo.provinces.cities[j].quxian[k]; if(k!=zhongguo.provinces.cities[j].quxian.length-1) { str+=&quot;,&quot;; } } str+=&quot;}&quot;; } } str+=&quot;}\n&quot;; } } str+=&quot;}&quot;; alert(str);</pre><p><br/></p><p>弹出&quot;</p><p>中国:{</p><p>北京{北京市{海淀区,朝阳区,东城区,西城区}}</p><p>安徽省{芜湖市{繁昌县,芜湖县,南陵县,三山区}合肥市{肥西县,蜀山区,庐阳区}}</p><p>}</p><p>&quot;。</p><p>三、Json在Ajax中的应用</p><p>客户端可以给服务器端通过地址栏或者post很容易的提交数据,但是服务器端处理完数据之后,将计算的结果信息回传给客户端时就存在了一定的难度,特别是 数据量较大时。这个时候数据的格式成了关键,按照某种格式可以很方便的进行数据的组装,然后可以很方便的进行解析。使用Json便是一种很好的策略。在服 务器端,按照Json的格式拼装好一个字符串,响应给客户端。客户端如何进行解析呢?一般有两种策略(两种策略的名称是自己给的名字,不一定很合理,但是 思路应该是没有问题的):</p><p>1.直接解析</p><p>var json = eval(&#39;(&#39; + result + &#39;)&#39;);</p><p>通过上面这个表达式,就完成了将服务器端响应给客户端的Json格式的字符串解析成了一个Json(格式的)对象,名称为&quot;json&quot;,通过&quot;json.&quot;或者&quot;json[]&quot;的方式便可进行数据访问。</p><p>2.间接解析</p><pre class="brush:js;toolbar:false">varjson=&quot;r=&quot;+result; eval(json);</pre><p>当然上面行代码可以合并为:eval(&quot;r=&quot; + result);</p><p>通过上面的计算,也可以将服务器端响应给客户端的Json格式的字符串解析成了一个Json(格式的)对象,但是该对象名称为&quot;r&quot;,通过&quot;r.&quot;或者&quot;r[]&quot;的方式可进行数据访问。</p><p>总结:Json是一种简单的数据交换格式,它几乎可以很好的代替xml让服务器之间灵活的交换数据。</p><p>四、JavaScript中的数组和对象</p><p>在JavaScript中,通常用[]创建的数据格式称为数组,用{}创建的东西称为对象。</p><p>有一个数组a=[1,2,3,4],还有一个对象a={0:1,1:2,2:3,3:4},运行alert(a[1]),两种情况下的运行结果是相同的!这就是说,数据集合既可以用数组表示,也可以用对象表示,那么到底该用哪一种呢?</p><p>其实数组表示有序数据的集合,而对象表示无序数据的集合。如果数据的顺序很重要,就用数组,否则就用对象。</p><p>当然,数组和对象的另一个区别是,数组中的数据没有&quot;名称&quot;(name),对象中的数据有&quot;名称&quot;(name)。但是问题是,很多编程语言中,都有一种叫 做&quot;关联数组&quot;(associativearray)的东西。这种数组中的数据是有名称的。比如在javascript中,可以这样定义一个对象:</p><pre class="brush:js;toolbar:false">vara={&quot;城市&quot;:&quot;北京&quot;,&quot;面积&quot;:16800,有趣,&quot;人口&quot;:1600}; 但是,也可以定义成一个关联数组: vara=newArray(); a[&quot;城市&quot;]=&quot;北京&quot;; a[&quot;面积&quot;]=16800; a[&quot;人口&quot;]=1600;</pre><p>这样一来好像数组和集合就没有区别了,其实不是,在Javascript语言中,关联数组就是对象,对象就是关联数组。通过第二种方式创建的数组和通过 []方式创建的数组是有很大的区别的,在第二个方式创建的&quot;数组&quot;中,也可以和第一种方式类似,通过&quot;a.城市&quot;来得到&quot;北京&quot;,&quot;a.人口&quot;来得到 &quot;1600&quot;,但是它和第一种方式创建的对象又是有区别的,通过第一种方式定义的a是没有length属性的,二通过第二种方式定义的a有,可是值为0, 可见里面的差别还是有的,要想具体搞清楚,恐怕得看看底层的一些实现代码了。</p><p>当 eval 返回的 json 值时,提示 Error: Invalid Label 摘要: 我们经常会在服务器端返回 json 格式的值,这样可以直接在脚本中当作完整的对象来使用,但是,许多新手通常都会遇到一个错误提示:Invalid Label ,这个问题通常会让人苦恼不堪,因为明明正确的 json 格式,却提示错误。如果你遇到此问题,那赶快看看本文的内容吧!</p><p>我们经常会在服务器端返回 json 格式的值,这样可以直接在脚本中当作完整的对象来使用,但是,许多新手通常都会遇到一个错误提示: Invalid Label ,这个问题通常会让人苦恼不堪,因为明明正确的 json 格式,却提示错误。</p><p>假如你从服务器端返回的是 json 格式的字符串:</p><p>&gt;</p><p>当你在脚本中用 eval 的方式运行:</p><p>&gt;</p><p>这时会提示 : Error: Invalid Label</p><p>实际上,我们的 json 格式并没有错误,只是在 eval 的时候,要把你的 json 值用 &quot;()&quot; 括号括起来:</p><pre class="brush:js;toolbar:false">&gt;varresult=eval(&quot;(&quot;+o.responseText+&quot;)&quot;);help001</pre>
T:0.006727s,M:256 KB
返回顶部 留言