一、JSON(JavaScript Object Notation)的定义:

    一种轻量级的数据交换格式,具有良好的可读和便于快速编写的特性。业内主流技术为其提供了完整的解决方案(有点类似于正则表达式,获得当今大部分语言的支持),从而可以在不同平台间进行数据交换。JSON采用兼容性很高的文本格式,同时也具备类似于C语言体系的行为。

二、JSON的结构:

(1) Name/Value Pairs(无序):类似于Keyed list、Hash table、Dictionary。在Android平台中同时存在另外一个类"Bundle",也具有相似的行为。

(2) Array(有序):一组有序的数据列表。

对象

    对象是一个无序的Name/Value Pairs集合。如{"name":"kirl","num":75}

Array

    Array是值(value)的有序集合。值(value)可以是字符串(string)、数值(number)、true、false、null、对象(object)或者数组(array)。这些结构可以嵌套。

Array里面包含对象(object)    [{"id":75,"name":"kirl"} , {"id":25,"name":"sx"} ,  ......]

对象(object)中可以包含Array,3个对象,其中1个对象包含1个数组,2个子对象

{

"first":[{"id":1,"name":"kirl"},{"id":2,"name":"sx"}],

"second":75,

"third":true

}

对象嵌套子对象,子对象再嵌套数组

{"root":

    {"child":

          [

{"id":1,"name":"kirl"},

{"id":2,"name":"sx"}

]

    }

}

三、在Android中包含四个与JSON相关的类和一个Exceptions:

JSONObject、JSONArray、JSONStringer、JSONTokener、JSONException

(1)JSONObject:

    这是系统中有关JSON定义的基本单元,其包含一对儿(Key/Value)数值。

toString()方法输出的数值为 {"KIRL":"Test"},初始化一个JSONObject实例,引用put()方法添加数值:new JSONObject().put("KIRL","Test")。

Value的类型包括:Boolean、JSONArray、JSONObject、String等。

两个不同的取值方法:

get() : 在确定数值存在的条件下使用,否则当无法检索到相关Key时,将会抛出一个Exception消息。

opt() : 这个方法相对比较灵活,当无法获取所指定数值时,将会返回一个默认数值,并不会抛出异常。

(2) JSONArray:

    它代表一组有序的数值,格式如[value1,value2,value3]。其方法与JSONObject类似。

(3) JSONStringer:

    这个类可以帮助快速和便捷的创建JSON text。其最大的优点在于可以减少由于格式的错误导致程序异常,引用这个类可以自动严格按照JSON语法规则创建JSON text。每个JSONStringer实体只能对应创建一个JSON text。

 

 
  
  1. String myString = new JSONStringer().object()  
  2. .key("name")  
  3. .value("kirl").endObject().toString();  
  4. System.out.println(myString); 

输出结果是一组标准格式的JSON text : {"name":"kirl"}
 

其中的.object()和.endobject()必须同时使用,是为了按照Object标准给数值添加边界。同样,针对数组也有一组标准的方法来生成边界.array()和.endArray()。

(4) JSONTokener:

    这个是为JSONObject和JSONArray构造器解析JSON source string的类,它可以从source string中提取数值信息。

(5) JSONException:

    为JSON.org类抛出的异常信息。

四、详细示例:

 
  
  1. import org.json.*;  
  2. import java.util.*;  
  3. public class TestJson {  
  4.     /**  
  5.      * 获取"数组形式"的JSON数据,  
  6.      * 数据形式:[{"id":1,"name":"kirl"},{"id":2,"name":"sx"}]  
  7.      * @param myJson 数值内容  
  8.      * @throws Exception  
  9.      */ 
  10.     public static void getJSONArray(String myJson) throws Exception  
  11.     {  
  12.         System.out.println("getJSONArray");  
  13.         //数据直接为一个数组形式,所以可以直接用Android提供的框架JSONArray读取JSON数据,转换成Array  
  14.         JSONArray jsonArray = new JSONArray(myJson);  
  15.         for(int i = 0;i < jsonArray.length();i++)  
  16.         {  
  17.             //每条记录又由几个Object对象组成  
  18.             JSONObject item = jsonArray.getJSONObject(i);  
  19.             //获取对象的内容  
  20.             int id = item.getInt("id");  
  21.             String name = item.getString("name");  
  22.             System.out.println("id->" + id);  
  23.             System.out.println("name->" + name);  
  24.         }  
  25.     }  
  26.     /**  
  27.      * 获取"对象形式"的JSON数据,  
  28.      * 数据形式:{"first":75,"second":true,"third":[{"id":1,"name":"kirl"},{"id":2,"name":"sx"}]}  
  29.      * @param myJson  
  30.      * @throws Exception   
  31.      */ 
  32.     public static void getJSONObject(String myJson) throws Exception  
  33.     {  
  34.         System.out.println("getJSONObject");  
  35.         //返回的数据是一个Object类型,所以可以直接转换成一个Object  
  36.         JSONObject jsonObject = new JSONObject(myJson);  
  37.         int first = jsonObject.getInt("first");  
  38.         Boolean second = jsonObject.getBoolean("second");  
  39.         System.out.println("first->" + first);  
  40.         System.out.println("second->" + second);  
  41.         //数组数据用getJSONArray获取数组  
  42.         JSONArray jsonArray = jsonObject.getJSONArray("third");  
  43.         for(int i = 0;i < jsonArray.length();i++)  
  44.         {  
  45.             //得到每个对象  
  46.             JSONObject item = jsonArray.getJSONObject(i);  
  47.             //获取对象对应的值  
  48.             int id = item.getInt("id");  
  49.             String name = item.getString("name");  
  50.             System.out.print("third->");  
  51.             System.out.print("id->" + id);  
  52.             System.out.println(",name->" + name);  
  53.         }  
  54.     }  
  55.     /**  
  56.      * @param args  
  57.      * @throws Exception   
  58.      */ 
  59.     public static void main(String[] args) throws Exception {  
  60.         // TODO Auto-generated method stub  
  61.         String json = "[{\"id\":1,\"name\":\"kirl\"},{\"id\":2,\"name\":\"sx\"}]";  
  62.         getJSONArray(json);  
  63.         json = "{\"first\":75,\"second\":true,\"third\":[{\"id\":1,\"name\":\"kirl\"},{\"id\":2,\"name\":\"sx\"}]}";  
  64.         getJSONObject(json);  
  65.     }  

输出结果为:

getJSONArray
id->1
name->kirl
id->2
name->sx
getJSONObject
first->75
second->true
third->id->1,name->kirl
third->id->2,name->sx