2016年3月3日星期四

JSON 数据格式详解

JSON官网: www.json.org
  JSON (JavaScript Object Notation) JavaScript对象图,它是由Douglas Crockford(道格拉斯·克洛克福特)发明的。
  JSON与XML一样都是做传递数据使用, 在目前的网络应用下传递数据主要有两种,一种是XML,一种就是JSON数据,而JSON使用数量还更多。
  JSON是一种文本格式(注意不是文档格式!),它是独立存在的而不局限于某一种语言,它是一种很理想的数据交换格式。
  JSON基于两种结构来构建:
    1. 名字/键值对。在Java中类似MAP
    2. 它是一个有序值的列表。
  这是一种很常见的数据结构,也兼容了现在大部分的程序设计语言,这就使得不同的程序设计语言通过上面两种数据结构来进行数据交换而变得很有意义。
1. JSON各种数据的格式说明
1) object(对象)
JSON中对象是一个无序的 名/值 对。一个对象用"{" 开始和"}"号结束。名和值之间用":"隔开,如果有多个对象需要用","隔开。
类似{"name":"value", "flag":false}
【注意】----------------------------
在JavaScript中对象的表示形式是
var s = {'a':'b', c:false}
s.a 打印出b
s.b 打印出false
上面就是一种很简单的数据表示格式,是在js中表示的,但是在JSON数据格式中我们还是严格按照标准用双引号来。Json数据格式可以表示成很复杂的数据结构,包括可以嵌套,而且可以兼容数组这个概念,数组里面里面可以存放对象,对象里面又可以存放数组。
2) array(数组)
JSON中数组是一个有序的元素的集合,一个数组以"["开始和以"]"结束,不同的元素用","隔开。
类似{"students":[{"name":"AHuier", "age":23}, {"name":"Jack", "age":22}]}
【注意】----------------------------
在JavaScript中数组的表示形式是
var s = ['a','b','c',false]
这仅仅是在js中是如此表示的,在json数据格式的表示方法还是不一样的。
3) value(值)
值可以是一个在双引号里面的字符串,或者是一个数字,或者是boolean类型(true, false)或者为null,或者是一个对象或者是一个数组,这些结构还可以进行嵌套。
4) string(字符串)
字符串是一个零或者多个Unicode字符组成的序列,它们包含于双引号中,可以使用反斜杠转义。一个字符可以看做是长度为1的字符串, 这很像C或者Java语言中的string.
类似{"name":"AHuier", "age":"23"}
5) number(数字)
数字和C或者Java语言类似,除了JSON不支持八进制和十六进制的数据格式。
空格可以被随意插入到任意两个名值对之间。
2. JSON 与 XML
   1) JSON与XML都可以进行数据的传输,XML除了可以做数据的传输之外,可以作为一个小型的数据格式来保存数据,但是JSON仅仅是用来作为数据传输的,它不会保存数据。
   2) Json传递的数据量很小,特别是传输很多数据的时候,可以有效的减少带宽。
   3) JSON不是一个文档的格式,Json也不是一种标记语言,JSON也不是一种通用的可序列化的格式.它仅仅是一种数据格式。
   4) XML中存在命名空间,但是在JSON中是不存在命名空间的概念的(因为它与XML不同没有DTD这种检查格式的规范)。在JSON中其实每一个对象都可以作为一个命名空间。
   5) JSON的MIME Media Type媒体类型是application/json,这个用在什么地方呢?
      在sevelet中,发送给客户端的格式通常是text/html,那如果是application/json 这样的话客户端浏览器在接受到响应头之后,它解析到此发现它是一个Json的数组格式,它就会以JSON的方式去处理。如果是 xml就是 text/xml 的方式去处理XML。
   注意:任何的XML都可以通过JSON的数据格式表示出来。JSON的编码格式统一是Unicode的格式,它的编码默认是utf-8.
[html] view plain copy
 在CODE上查看代码片派生到我的代码片
  1. 例如:讲如下的XML格式转换为JSON格式  
  2.   
  3. XML格式:  
  4.   
  5.     <users>  
  6.         <user gender="male">  
  7.             <username>AHuier</username>  
  8.             <age>23</age>  
  9.             <address>XIAMEN</address>  
  10.         </user>  
  11.         <user>  
  12.             <username>AHuier7</username>  
  13.             <age>23</age>  
  14.             <address>BEIJNG</address>  
  15.         </user>  
  16.     </users>  
  17.   
  18. JSON格式:  
  19.   
  20.     [{"username":"AHuier", "age":23, "address":"XIAMEN", "gender":"male"}{"username":"AHuier7", "age":23, "address":"BEIJING"}]  
【注意】:这里XML中的user的属性 gender在JSON中我们也可以将其当成一个对象名值对来看待。
3. JSON 与 XML的转换,如下,将下面的XML文档转换为JSON的数据格式。
   XML格式:
[html] view plain copy
 在CODE上查看代码片派生到我的代码片
  1. <section>  
  2.     <title>Book-Signing Event</title>  
  3.     <signing>  
  4.         <author title="Mr" name="Vikiram Seth" />  
  5.         <book title="A Suitable Boy" price="$22.95" />  
  6.     </signing>  
  7.     <signing>  
  8.         <author title="Dr" name="Oliver Sacks" />  
  9.         <book title="The Island of the Color-Blind" price="$12.95" />  
  10.     </signing>    
  11. </section>  
转换后JSON格式,在HTML文件中JS的形式写出,json.html
[html] view plain copy
 在CODE上查看代码片派生到我的代码片
  1. <script type="text/javascript">  
  2. var s = {"section":  
  3.     {  
  4.         "title":"Book-Signing Event",  
  5.         "signing":[  
  6.             {  
  7.                 "author":{"title":"Mr", "name":"Vikiram Seth"},  
  8.                 "book":{"title":"A Suitable Boy", "price":"$22.95"}  
  9.             },  
  10.             {  
  11.                 "author":{"title":"Dr", "name":"Oliver Sacks"},  
  12.                 "book":{"title":"The Island of the Color-Blind", "price":"$12.95"}  
  13.             }  
  14.         ]  
  15.     }  
  16. };  
  17.   
  18. alert(s.section.title);  
  19. alert(s.section.signing[0].author.title);  
  20. </script>  
【程序执行结果】:执行json.html文件
1. alert(s.section.title);请求"Book-Signing Event" 如下图所示
2. alert(s.section.signing[0].author.title);请求"Mr" 如下图所示
4. JSON 数据格式在Java中应用。
1) 首先从GitHub中下载JSON的包,将其拷贝到项目中放置在新建的一个独立包中如org.json包中,这样保持它的独立性。
    查看官网org.java中关于api的说明,我们比较常用的是JSONObject.java 与 JSONArray.java这两个类。
查看JSONObject.java的构造方法 它可以接受map对象[public JSONObject(java.util.Map map)]转换成json实例,也可以接受一个字符串[public JSONObject(java.lang.String source)]将其转换成json的实例。如下图所示
2) 常用JSON的API说明:在官网www.json.org中的 org.json 项目模块中(Java中解析json的开源项目很多,我们这里主要运用第一个org.json的项目,这个项目也是道格拉斯写的Java代码)
   public JSONObject(java.lang.String source) throws JSONException
     接受一个带有JSON对象格式的字符串,将其构造成json对象。(这样就可以通过JSONObject类里面的各种getXXX()方法将json里面对应名的值取出。)
   参数:
     source - A string beginning with { (left brace) and ending with } (right brace).
   public JSONArray(java.lang.String source) throws JSONException
     接受一个带有JSON数组格式的字符串,将其构造成json数组。
   参数:
     source - A string that begins with [ (left bracket) and ends with ] (right bracket). 
3) 程序Demo
   从org.json中下载对应的json包,这个项目托管在GitHub中,地址是:https://github.com/douglascrockford/JSON-java
   1. 在MyEclipse中新建Java项目,为了保持对JSON数据处理模块的独立性,我们可以将下载好的json包放置在独立的包中,这里我放置在org.json包中,如下图所示:
   
   2. 下面代码是对Json进行一些对象与字符串之间转换的简单操作。Test.java
[java] view plain copy
 在CODE上查看代码片派生到我的代码片
  1. package com.ahuier.json;  
  2.   
  3. import org.json.JSONArray;  
  4. import org.json.JSONObject;  
  5.   
  6. public class Test {  
  7.   
  8.     public static void main(String[] args) throws Exception {  
  9.   
  10.         // 相当于客户端给我们服务端传过来的JSON数据,它里面有两个名值对。  
  11.         String jsonContent = "{'hello':'world', 'abc':'xyz'}";  
  12.   
  13.         // 这里面有一个异常,因为有可能你传递过来的不是一个合法的JSON数据格式。  
  14.         JSONObject jsonObject = new JSONObject(jsonContent);  
  15.   
  16.         // jsonObject.getXXX() 之所以有这么多的get方法主要是因为传递过来的JSon值的类型可能有很多不一样的  
  17.         String str1 = jsonObject.getString("hello");  
  18.         String str2 = jsonObject.getString("abc");  
  19.   
  20.         System.out.println(str1);  
  21.         System.out.println(str2);  
  22.   
  23.         // 下面处理数组  
  24.         System.out.println("----------------------------------");  
  25.         jsonContent = "[{'AHuier':'XIAMEN', 'age':30, 'flag':false}, " +  
  26.                 "{'AHuier':'BEIJING', 'age':24, 'flag':true}]";  
  27.   
  28.         // 既然是数组,JSONArray里面肯定提供操作数组的方法。  
  29.         JSONArray jsonArray = new JSONArray(jsonContent);  
  30.   
  31.         // 所以我们需要遍历这个数组,用getJSONObject()方法,返回JSONObject对象  
  32.         // 这样我们就可以类似上例中通过JSONObject对象取出相应的值.  
  33.         for (int i = 0; i < jsonArray.length(); i++) {  
  34.             JSONObject jsonObject2 = jsonArray.getJSONObject(i);  
  35.             String str = jsonObject2.getString("AHuier");  
  36.             int value = jsonObject2.getInt("age");  
  37.             boolean flag = jsonObject2.getBoolean("flag");  
  38.             System.out.println(str + " " + value + " " + flag);  
  39.         }  
  40.     }  
  41. }  
程序执行结果:
world
xyz
----------------------------------
XIAMEN 30 false
BEIJING 24 true
[注意]:上述程序数组这块代码段进行修改,在数组中的一个对象元素中再嵌入对象,则遍历方式需要改变如下所示:
[java] view plain copy
 在CODE上查看代码片派生到我的代码片
  1. // 下面处理数组  
  2. System.out.println("----------------------------------");  
  3. jsonContent = "[{'AHuier':'XIAMEN', 'age':30, 'flag':false, 'add':{'a':1, 'b':'ab'}}, " +  
  4.         "{'AHuier':'BEIJING', 'age':24, 'flag':true, 'add':{'a':3, 'b':'ba'}}]";  
  5.   
  6. // 既然是数组,JSONArray里面肯定提供操作数组的方法。  
  7. JSONArray jsonArray = new JSONArray(jsonContent);  
  8.   
  9. // 所以我们需要遍历这个数组,用getJSONObject()方法,返回JSONObject对象  
  10. // 这样我们就可以类似上例中通过JSONObject对象取出相应的值.  
  11. for (int i = 0; i < jsonArray.length(); i++) {  
  12.     JSONObject jsonObject2 = jsonArray.getJSONObject(i);  
  13.     String str = jsonObject2.getString("AHuier");  
  14.     int value = jsonObject2.getInt("age");  
  15.     boolean flag = jsonObject2.getBoolean("flag");  
  16.       
  17.     JSONObject jsonObject3 = jsonObject2.getJSONObject("add");  
  18.     int value2 = jsonObject3.getInt("a");  
  19.     String str3 = jsonObject3.getString("b");   
  20.     System.out.println(str + " " + value + " " + flag);  
  21.     System.out.println(value2 + str3);  
程序执行结果:
world
xyz
----------------------------------
XIAMEN 30 false
1ab
BEIJING 24 true
3ba
5. JSON官网: www.json.org 中Java项目的JSON开源库我们一般使用的是 org.json | google-gson | Json-lib 等这几个项目,在后面的内容中我们都会使用到这些优秀的JSON开源项目,读者可以自己去读项目介绍。
   org.json 项目存放的路径是在GitHub
   gson 存放的是托管在code.google
   JSON-lib 存放是托管在 sourceforge

没有评论: