Android json数据解析

今天很高兴和大家一起学习Android的JSON数据解析,可能对于学习安卓的朋友都知道JSON在数据解析方面已经很普遍了.所以也是我们必定要了解的知识 ,下面让我们了解一下JSON的发展历程.

XML——这种用于表示客户端与服务器间数据交换有效负载的格式,几乎已经成了Web services的同义词。然而,由于Ajax和REST技术的出现影响了应用程序架构,这迫使人们开始寻求`XML的替代品,如:JavaScript Object Notation(JSON)。

  JSON 作为一种更轻、更友好的 Web services客户端的格式(多采用浏览器的形式或访问 REST风格 Web服务的Ajax应用程序的形式)引起了 Web 服务供应商的注意。

  本文将阐述JSON在Web services设计中备受推崇的原因,以及它作为XML替代方案的主要优势和局限性。文中还会深入探讨:随着相应的Web 服务客户端选择使用JSON,如何才能便捷地在Java Web services中生成JSON输出。

XML的十字路口: 浏览器和 Ajax

  XML设计原理已经发布了将近十年。时至今日,这种标记语言已经在广阔的软件应用领域中占据了主导地位。从Java、.NET等主流平台中的配置和部署描述符到应用集成场景中更复杂的应用,XML与生俱来的语言无关性使之在软件架构师心目中占据着独特的地位。但即便最著名的XML权威也不得不承认:在某些环境中,XML的使用已经超出了它自身能力的极限。

  围绕Ajax原理构建的那些Web应用程序最能说明XML的生存能力,从这一点来看,一种新的有效负载格式的发展壮大也得益于XML。这种新的有效负载格式就是JavaScript Object Notation (JSON)。在探索这种新的标记语言的复杂性之前,首先来分析一下在这种独特的设计形式中,XML具有哪些局限性。

  Ajax建立了一个用于从远程Web services发送和接收数据的独立信道,从而允许Web程序执行信道外(out-of-band)客户端/服务器调用。通俗地说,Ajax程序中的更新和导航序列在典型的客户端/服务器环境之外完成,在后台(即信道外)接受到信息后,必须进行一次完整的屏幕刷新。更多背景信息,请参阅David Teare的 Ajax简介(Dev2Dev)。

  这些应用程序更新通常是通过REST风格(RESTful)Web services获得的,一旦被用户的浏览器接收到,就需要整合到HTML页面的总体布局之中,这正是XML发挥强大力量的场合。尽管近年来,脚本语言支持和插件支持已使大多数主流浏览器的功能得到了强化,但许多编程任务依然难于开展,其中之一就是操纵或处理文本,这通常是使用DOM实现的。

  采用DOM的复杂性源于其基于函数的根,这使得对数据树的简单修改或访问都需要进行无数次方法调用。此外,众所周知,DOM在各种浏览器中的实现细节不尽相同,这一过程将带来极为复杂的编程模式,其跨浏览器兼容性出现问题的可能性极大。接下来的问题显而易见,那就是:如何使一种标记语言轻松集成到HTML页面中以满足Ajax的要求?

  问题的答案就是:利用所有主流浏览器中的一种通用组件——JavaScript引擎。XML需要使用DOM之类的机制来访问数据并将数据整合到布局之中,采用这种方法,我们不再使用像XML这样的格式来交付Ajax更新,而是采用一种更为简单直观的方式,采用JavaScript引擎自然匹配的格式——也就是JSON。

  既然已经明确了JSON与XML和Ajax之间的关系,下面将进一步探讨JSON背后的技术细节。

JSON剖析:优点和不足

  对于JSON,首先要明白JSON和XML一样也是一种简单文本格式。相对于XML,它更加易读、更便于肉眼检查。在语法的层面上,JSON与其他格式的区别是在于分隔数据的字符,JSON中的分隔符限于单引号、小括号、中括号、大括号、冒号和逗号。下图是一个JSON有效负载:

[java]  view plain copy 在CODE上查看代码片 派生到我的代码片
  1. {"addressbook": {"name""Mary Lebow",  
  2.     "address": {  
  3.         "street""5 Main Street"  
  4.         "city""San Diego, CA",  
  5.         "zip"91912,  
  6.     },  
  7.     "phoneNumbers": [  
  8.         "619 332-3452",  
  9.         "664 223-4667"  
  10.     ]  
  11.  }  
  12. }  

上面的格式没看清楚不要紧,我们慢慢来分析.

下面我们来看看JSON的数据结构:

1.JSON数据结构

  在JSON中有两种数据结构:对象和数组。

1.1对象

  在JSON中,一个对象以“{”(左括号)开始,“}”(右括号)结束。每个“名称”后跟一个“:”(冒号),冒号后是该名称的值,多个“名称:值”之间使用 “,”(逗号)分隔开来。名称需要使用双引号括起来,值如果是字符串则必须用双引号括起来,如果是数值型则不需要。其结构示意图如图1所示。

例如:


[java]  view plain copy 在CODE上查看代码片 派生到我的代码片
  1. {  
  2.   
  3. "name":"BruceCheng",   
  4.   
  5. "age":22,  
  6.   
  7. "address":"安徽省合肥市"  
  8.   
  9. }  

1.2数组

  在JSON中,数组是值(value)的有序集合。一个数组以“[”(左中括号)开始,“]”(右中括号)结束。值之间使用 “,”(逗号)分隔开来。其结构示意图如图2所示。


例如:

[java]  view plain copy 在CODE上查看代码片 派生到我的代码片
  1. ["Android","IOS","Syphone","BlackBerry"]  

那么在JSON数据中值的类型有哪些呢?

竟然JSON的数据类型是多种多样的那么我们就可以利用不同类型的数据组合成复杂的数据类型:

[java]  view plain copy 在CODE上查看代码片 派生到我的代码片
  1. {"addressbook": {"name""Mary Lebow",  
  2.      "address": {  
  3.          "street""5 Main Street"  
  4.          "city""San Diego, CA",  
  5.          "zip"91912,  
  6.      },  
  7.      "phoneNumbers": [  
  8.          "619 332-3452",  
  9.          "664 223-4667"  
  10.      ]  
  11.   }  
  12.  }  

我们来分析分析:

从上面整体来看是一个Object类型,该Object类型中有一个成员为:"addressbook"

"addressbook"的数据结构又是一个Object类型,

该Object类型又包含三个成员,分别是"name","address","phoneNumbers"

这三个成员数据结构的类型分别是:String,Object,Array,

"name"的值为String类型

"address"的数据结构为Object类型,它又包含三个子成员,分别是:"street","city","zip",这三个成员的数据结构类型的类型均为String类型,
"phoneNumbers"成员的数据结构为数组类型,包含两个成员为String类型.


JSON解析分为两种情况,一种是在服务器端解析,另一种是在客户端解析

第一种:在服务器段解析:

   通常,客户端在请求服务器数据时,服务器可以使用XML文档、JSON数据或HTML的形式将数据发送给客户端。

  那么如何在服务器端生成JSON数据呢?首先需要完成以下两个准备工作。

  (1)我们需要使用Eclipse创建了一个Web Project,这里我将该工程命名为了“AndroidToJSON解析”(方便查看,开发时不要用中文),用来模拟服务器端的Web服务。

  (2)我们还需要在该工程中导入JSON的API数据包json-lib-2.2.2-jdk15.jar

        下载地址:http://download.csdn.net/detail/u013059555/6673615

  在JSON的API中,提供了JSONObject类,通过调用JSONObject类的put(Object key, Object value)方法,可以将一个Object对象以键值对的形式存入JSONObject对象。通过调用JSONObject类的toString()方法,则可以将JSONObject对象转化为JSON数据。

  如下的代码创建了一个JsonTools类,并实现了静态方法createJsonString(),用来生成JSON数据。

[java]  view plain copy 在CODE上查看代码片 派生到我的代码片
  1. public class JsonTools {  
  2.     /** 
  3.      *  
  4.      * @param   key   json数据的键值 
  5.      * @param   value 生成的json数据的value值 
  6.      * @return  json对象的值 
  7.      * @author  brucecheng夏夏 
  8.      */  
  9.     public static String createJsonString(String key,Object value){  
  10.         //创建  
  11.         JSONObject json=new JSONObject();  
  12.         //此处要try----catch一下  
  13.         try {  
  14.             json.put(key, value);  
  15.         } catch (JSONException e) {  
  16.             e.printStackTrace();  
  17.         }  
  18.         return json.toString();  
  19.     }  


通过使用该方法,我们可以很方便的将各种数据传递进来,并将其转化成JSON数据。比如,我们可以在JsonService类中,实现一个简单的获取Person对象列表的方法,具体如下:

编写一个JavaBeans:

Person类:id,name,age三个属性

[java]  view plain copy 在CODE上查看代码片 派生到我的代码片
  1. public class JsonService {  
  2.     public List<Person> getListPerson(){  
  3.         List<Person> list=new ArrayList<Person>();  
  4.         Person p1=new Person(1001"Bruce"20);  
  5.         Person p2=new Person(1002"Jack"21);  
  6.         Person p3=new Person(1003"David"22);  
  7.         list.add(p1);  
  8.         list.add(p2);  
  9.         list.add(p3);  
  10.         return list;  
  11.     }  
  12. }  
最后,我们可以创建一个继承自HttpServlet的JsonAction类,并实现其中的doPost()方法,用来响应客户端对服务器的请求。具体如下:

[java]  view plain copy 在CODE上查看代码片 派生到我的代码片
  1. public void doPost(HttpServletRequest request, HttpServletResponse response)  
  2.             throws ServletException, IOException {  
  3.   
  4.         response.setContentType("text/html;charset=utf-8");  
  5.         request.setCharacterEncoding("utf-8");  
  6.         response.setCharacterEncoding("utf-8");  
  7.         PrintWriter out = response.getWriter();  
  8.           
  9.         List<Person> listPerson = jsonService.getListPerson();  
  10.           
  11.         String str = null;  
  12.         String action_flag = request.getParameter("action_flag");    //获取URL参数  
  13.         if(action_flag.equals("persons")) {  
  14.             str = JsonTools.createJsonString("persons", listPerson);  
  15.         }  
  16.         out.println(str);  
  17.         out.flush();  
  18.         out.close();  
  19.     }  

可以看到,在doPost()方法中,我们通过调用getListPerson()方法获得了Person对象列表listPerson,并将其传入JsonTools.createJsonString()方法中,从而获得了一串JSON数据。

  将该工程发布到Tomcat上,使用浏览器访问该Web工程,可以看到如图4所示的界面,Person对象列表被成功的转化成了JSON数据。


以上就成功的将数据部署到服务器中了,

接下来我们新建一个安卓的工程来获取相应的解析数据:

当点击Button时将解析出来的数据绑定到textView上去

布局文件代码如下:

[html]  view plain copy 在CODE上查看代码片 派生到我的代码片
  1. <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"  
  2.     xmlns:tools="http://schemas.android.com/tools"  
  3.     android:layout_width="match_parent"  
  4.     android:layout_height="match_parent" >  
  5.   
  6.     <Button  
  7.         android:id="@+id/btn_json"  
  8.         android:layout_width="match_parent"  
  9.         android:layout_height="wrap_content"  
  10.         android:text="@string/json"  
  11.         android:textColor="#0000ff"  
  12.         android:textSize="20sp" />  
  13.   
  14.     <ScrollView  
  15.         android:layout_width="match_parent"  
  16.         android:layout_height="match_parent"  
  17.         android:layout_below="@id/btn_json" >  
  18.   
  19.         <TextView  
  20.             android:id="@+id/tv_show"  
  21.             android:layout_width="match_parent"  
  22.             android:layout_height="wrap_content"  
  23.             android:text="@string/hello_world"  
  24.             android:textColor="#0000ff"  
  25.             android:textSize="20sp" />  
  26.     </ScrollView>  
  27.   
  28. </RelativeLayout>  

要完成解析我们需要编写以下几个类:

第一个:
Person类的java beans和之前的一样不再重写

第二个:

JsonTools类其功能是根据key和json数据来解析获得数据

[java]  view plain copy 在CODE上查看代码片 派生到我的代码片
  1. package com.brucecheng.json;  
  2.   
  3. import java.util.ArrayList;  
  4. import java.util.List;  
  5. import org.json.JSONArray;  
  6. import org.json.JSONObject;  
  7.   
  8. public class JsonTools {  
  9.     //自定义一个方法解析  
  10.     public static List<Person> getPerson(String key,String jsonString){  
  11.         List<Person> persons=new ArrayList<Person>();  
  12.         try {  
  13.             //获取Json对象  
  14.             JSONObject jsonObj=new JSONObject(jsonString);  
  15.             //由Json对象获取JsonArray  
  16.             JSONArray jsonArr=jsonObj.getJSONArray(key);  
  17.             //遍历数组获得每一个jsonObject对象  
  18.             for (int i = 0; i < jsonArr.length(); i++) {  
  19.                 JSONObject personObj=jsonArr.getJSONObject(i);  
  20.                 int id=personObj.getInt("id");  
  21.                 String name=personObj.getString("name");  
  22.                 int age=personObj.getInt("age");  
  23.                 Person p=new Person(id,name,age);  
  24.                 persons.add(p);  
  25.             }  
  26.         } catch (Exception e) {  
  27.             e.printStackTrace();  
  28.         }  
  29.         return persons;  
  30.     }  
  31. }  

第三个:

HttpUtils类,本类的作用是根据路径打开连接获取json数据

[java]  view plain copy 在CODE上查看代码片 派生到我的代码片
  1. package com.brucecheng.json;  
  2.   
  3. import java.io.ByteArrayOutputStream;  
  4. import java.io.InputStream;  
  5. import java.net.HttpURLConnection;  
  6. import java.net.URL;  
  7.   
  8. public class HttpUtils {  
  9.     //定义一个静态的方法获取JSON内容  
  10.     //这里的path是web服务的网址  
  11.     public static String getJsonContent(String path){  
  12.         try {  
  13.             //根据路径创建URL地址  
  14.             URL url=new URL(path);  
  15.             //通过url地址打开连接  
  16.             HttpURLConnection conn=(HttpURLConnection) url.openConnection();  
  17.             //设置超时时间  
  18.             conn.setConnectTimeout(10000);  
  19.             //设置请求方式  
  20.             conn.setRequestMethod("GET");  
  21.             //设置属性  
  22.             conn.setRequestProperty("User-Agent","Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 6.1; Trident/4.0; SLCC2; .NET CLR 2.0.50727; .NET CLR 3.5.30729; .NET CLR 3.0.30729; Media Center PC 6.0; .NET4.0C; .NET4.0E)");  
  23.             //设置该连接是否可输入  
  24.             //conn.setDoInput(true);  
  25.             int code=conn.getResponseCode();  
  26.             System.out.println(code+"****");  
  27.             if(code==200){  
  28.                 return changeInputString(conn.getInputStream());  
  29.             }  
  30.         } catch (Exception e) {  
  31.             e.printStackTrace();  
  32.         }  
  33.         return "";  
  34.     }  
  35.     //自定义方法根据io流得到字符串  
  36.     public static String changeInputString(InputStream is){  
  37.         String jsonString="";  
  38.         ByteArrayOutputStream baos=new ByteArrayOutputStream();  
  39.         byte[] data=new byte[1024];  
  40.         int len=0;  
  41.         try {  
  42.             while((len=is.read(data))!=-1){  
  43.                 baos.write(data,0,len);  
  44.             }  
  45.             jsonString=new String(baos.toByteArray());  
  46.         } catch (Exception e) {  
  47.             e.printStackTrace();  
  48.         }  
  49.         return jsonString;  
  50.     }  
  51. }  

运行结果如下:







原创作品,允许转载,转载时请务必以超链接形式标明文章  原始出处 、作者信息和本声明。否则将追究法律责任。 http://gejw0623.blog.51cto.com/4532274/1139437
什么是json? 一种轻量级的数据交换格式,具有良好的可读和便于快速编写的特性。
前面几章讲到了xml的解析和生成,本章讲解下json的解析和生成
 
首先我们看下json和xml的异同处
1.JSON和XML的数据可读性基本相同
2.JSON和XML同样拥有丰富的解析手段
3.JSON相对于XML来讲,数据的体积小
4.JSON与JavaScript的交互更加方便
5.JSON对数据的描述性比XML较差
6.JSON的速度要远远快于XML
JSON解析类可以分为以下几个类
 
    JSONObject:可以看作是一个json对象,这是系统中有关JSON定义的基本单元,其包含一对儿(Key/Value)数值。它对外部(External:   应用toString()方法输出的数值)调用的响应体现为一个标准的字符串(例如:{"JSON": "Hello, World"},最外被大括号包裹,其中的Key和Value被冒号":"分隔)。其对于内部(Internal)行为的操作格式略微,例如:初始化一个JSONObject实例,引用内部的put()方法添加数值:new JSONObject().put("JSON", "Hello, World!"),在Key和Value之间是以逗号","分隔。Value的类型包括:Boolean、JSONArray、JSONObject、Number、String或者默认值JSONObject.NULL object 。
 
    JSONStringer:json文本构建类 ,根据官方的解释,这个类可以帮助快速和便捷的创建JSON text。其最大的优点在于可以减少由于 格式的错误导致程序异常,引用这个类可以自动严格按照JSON语法规则(syntax rules)创建JSON text。每个 JSONStringer实体只能对应创建一个JSON text。。其最大的优点在于可以减少由于格式的错误导致程序异常,引用这个类可以自动严格按照JSON语法规则(syntax rules)创建JSON text。每个JSONStringer实体只能对应创建一个JSON text。
 
    JSONArray:它代表一组有序的数值。将其转换为String输出(toString)所表现的形式是用方括号包裹,数值以逗号”,”分隔(例如:     [value1,value2,value3],大家可以亲自利用简短的代码更加直观的了解其格式)。这个类的内部同样具有查询行为,     get()和opt()两种方法都可以通过index索引返回指定的数值,put()方法用来添加或者替换数值。同样这个类的value类型可以包括:Boolean、JSONArray、JSONObject、Number、String或者默认值JSONObject.NULL object。
 
    JSONTokener:json解析类 
    JSONException:json中用到的异常  

一、构建json
首先  我们来构建一个下面的简单的json
    
    
  1. /** 
  2.      * 生成json 
  3.      * */ 
  4.     public String createJson() { 
  5.         // TODO Auto-generated method stub 
  6.  
  7.         try { 
  8.             JSONObject jsonObject = new JSONObject(); 
  9.             jsonObject.put("id""1"); 
  10.             jsonObject.put("name""李磊"); 
  11.             jsonObject.put("age""30"); 
  12.             return jsonObject.toString(); 
  13.         } catch (Exception e) { 
  14.             // TODO Auto-generated catch block 
  15.             e.printStackTrace(); 
  16.         } 
  17.         return ""
  18.     } 
得到的json数据为: {"id":"1","name":"李磊","age":"30"}
这应该算是最简单的一个json数据
实现的流程就是新建一个jsonobject对象,通过put将属性添加到json
 
接下来 我们来创建一个带有数组的json数据
    
    
  1. /** 
  2.  * 生成json 
  3.  * */ 
  4. public String createJson() { 
  5.     // TODO Auto-generated method stub 
  6.  
  7.     List<Person> persons = getTestValues(); 
  8.     try { 
  9.         JSONObject jsonObject = new JSONObject();
  10.  
  11.         JSONArray array = new JSONArray(); 
  12.         for (int i = 0; i < persons.size(); i++) { 
  13.             JSONObject person = new JSONObject(); 
  14.             Person p = persons.get(i); 
  15.             person.put("id", p.getId()); 
  16.             person.put("name", p.getName()); 
  17.             person.put("age", p.getAge()); 
  18.             array.put(person); 
  19.         } 
  20.         jsonObject.put("persons", array); 
  21.         System.out.println(jsonObject.toString()); 
  22.         return jsonObject.toString(); 
  23.     } catch (Exception e) { 
  24.         // TODO Auto-generated catch block 
  25.         e.printStackTrace(); 
  26.     } 
  27.     return ""
上面的代码  我们得到的是这样的数据
{"persons":[{"id":"1","age":"30","name":"李磊"},{"id":"2","age":"25","name":"韩梅梅"}]}
看了代码之后就会发现  代码很容易理解

1.创建最外层的{}对象jsonObject

2.创建数组对象 用来保存两个人的信息

3.在循环内创建jsonObject对象 用来保存每个人的信息,别忘了添加完属性之后 将对象添加到数组

4.将数组添加到最外层对象

 
我们除了使用jsonObject和jsonArray来创建json之外 我们还可以使用JSONStringer
    
    
  1. /** 
  2.  * 生成json 
  3.  * */ 
  4. public String createJson() { 
  5.     // TODO Auto-generated method stub 
  6.  
  7.     JSONStringer jsonStringer = new JSONStringer(); 
  8.     try { 
  9.         jsonStringer.object(); 
  10.         jsonStringer.key("id").value("1"); 
  11.         jsonStringer.key("name").value("李磊"); 
  12.         jsonStringer.key("age").value("30"); 
  13.         jsonStringer.endObject(); 
  14.          
  15.         System.out.println(jsonStringer.toString()); 
  16.     } catch (Exception e) { 
  17.         // TODO Auto-generated catch block 
  18.         e.printStackTrace(); 
  19.     } 
  20.      
  21.     return jsonStringer.toString(); 
上面的代码   我们得到了这样的数据 {"id":"1","name":"李磊","age":"30"}
和第一次获取的一块 接下来  我们讲下大概

1. 首先 新建JSONStringer对象

2. 调用object()方法 说明开始创建 添加了头{(当然,要和endobject成对出现)

3. 添加一个属性 通过key("name") 添加了属性了名称  通过value("value") 添加了属性的值

4. 添加完所有内容之后,调用endobject()方法通知json创建完毕

好了  接下来我们使用JSONStringer创建一个带有数组的json数据
    
    
  1. /** 
  2.  * 生成json 
  3.  * */ 
  4. public String createJson() { 
  5.     // TODO Auto-generated method stub 
  6.  
  7.     List<Person> persons = getTestValues(); 
  8.     JSONStringer jsonStringer = new JSONStringer(); 
  9.     try { 
  10.         jsonStringer.object(); 
  11.         jsonStringer.key("persons"); 
  12.         jsonStringer.array(); 
  13.          
  14.         for (int i = 0; i < persons.size(); i++) { 
  15.             Person person = persons.get(i); 
  16.              
  17.             jsonStringer.object(); 
  18.             jsonStringer.key("id").value(person.getId()); 
  19.             jsonStringer.key("name").value(person.getName()); 
  20.             jsonStringer.key("age").value(person.getAge()); 
  21.             jsonStringer.endObject(); 
  22.         } 
  23.         jsonStringer.endArray(); 
  24.          
  25.         jsonStringer.endObject(); 
  26.          
  27.         System.out.println(jsonStringer.toString()); 
  28.     } catch (Exception e) { 
  29.         // TODO Auto-generated catch block 
  30.         e.printStackTrace(); 
  31.     } 
  32.      
  33.     return jsonStringer.toString(); 
看下生成的字符串
{"persons":[{"id":"1","name":"李磊","age":"30"},{"id":"2","name":"韩梅梅","age":"25"}]}
是我们需要的数据

1.创建一个新的JSONStringer对象 用来存储生成的json数据

2.首先调用key("persons") 添加数组的key值

3.调用array()通知系统 接下来的是一个数组 (和endarray()一起出现)

4.在循环内部通过object()方法  创建一对{} 然后将属性添加到大括号内

上面的代码我们讲了怎么去生成json数据

二、解析JSON
接下来我们来解析一个最简单的json数据 数据为 {"id":"1","name":"李磊","age":"30"}
我们来看下解析的代码
    
    
  1. /** 
  2.      * 解析json 
  3.      * */ 
  4.     public Person parserJson() { 
  5.         // TODO Auto-generated method stub 
  6.  
  7.         String json = "{\"id\":\"1\",\"name\":\"李磊\",\"age\":\"30\"}"
  8.  
  9.         Person person = new Person(); 
  10.         try { 
  11.             JSONTokener jsonTokener = new JSONTokener(json); 
  12.              // 此时还未读取任何json文本,直接读取就是一个JSONObject对象。   
  13.             // 如果此时的读取位置在"name" : 了,那么nextValue就是"李磊"(String)   
  14.             JSONObject jsonObject = (JSONObject) jsonTokener.nextValue(); 
  15.             person.setId(jsonObject.getString("id")); 
  16.             person.setName(jsonObject.getString("name")); 
  17.             person.setAge(jsonObject.getString("age")); 
  18.  
  19.         } catch (Exception e) { 
  20.             // TODO Auto-generated catch block 
  21.             e.printStackTrace(); 
  22.         } 
  23.         return person; 
  24.     } 
我们解析的步骤

1.将json字符串转换为jsonTokener对象

2.调用jsonTokener的nextValue()方法  将json数据转换为jsonObject对象

3.通过getString(keyname)获取需要的值

当然  nextValue() 获取的不一定是jsonObject对象,详细解释看代码注释
 
接下来  我们要来解析这样的数据,带有数组哦~
{"persons":[{"id":"1","name":"李磊","age":"30"},{"id":"2","name":"韩梅梅","age":"25"}]}
不难  上代码
    
    
  1. public List<Person> parserJson() { 
  2.         // TODO Auto-generated method stub 
  3.  
  4.         String json = "{\"persons\":[{\"id\":\"1\",\"name\":\"李磊\",\"age\":\"30\"},{\"id\":\"2\",\"name\":\"韩梅梅\",\"age\":\"25\"}]}"
  5.  
  6.         List<Person> persons = new ArrayList<Person>(); 
  7.         try { 
  8.             JSONTokener jsonTokener = new JSONTokener(json); 
  9.             // 此时还未读取任何json文本,直接读取就是一个JSONObject对象。 
  10.             // 如果此时的读取位置在"name" : 了,那么nextValue就是"李磊"(String) 
  11.             JSONObject jsonObject = (JSONObject) jsonTokener.nextValue(); 
  12.             JSONArray array = jsonObject.getJSONArray("persons"); 
  13.             for (int i = 0; i < array.length(); i++) { 
  14.                 JSONObject object = array.getJSONObject(i); 
  15.                 Person person = new Person(); 
  16.                 person.setId(object.getString("id")); 
  17.                 person.setName(object.getString("name")); 
  18.                 person.setAge(object.getString("age")); 
  19.                 persons.add(person); 
  20.             } 
  21.  
  22.         } catch (Exception e) { 
  23.             // TODO Auto-generated catch block 
  24.             e.printStackTrace(); 
  25.         } 
  26.         return persons; 
  27.     } 
 同样的  我们来解释下代码

1.创建一个list 用来存储解析的信息

2.将json字符串转换为jsonTokener对象,再转换为jsonObject对象

3.通过getJSONArray("persons")获取json数组

4.通过循环来解析json数组,解析的内容不解释,上面已经说过

 
本章内容讲解结束  




json相关参考 
json规范rfc4627: http://www.ietf.org/rfc/rfc4627.txt 
json介绍: http://www.json.org/json-zh.html 
json入门参考: http://www.cnblogs.com/Truly/archive/2006/12/31/608896.html 

android2.3提供的json解析类 
android的json解析部分都在包org.json下,主要有以下几个类: 
JSONObject:可以看作是一个json对象 
JSONStringer:json文本构建类 
JSONArray:可以看作是json的数组 
JSONTokener:json解析类 
JSONException:json中用到的异常 

JSONObject, JSONArray来构建json文本 
Java代码   收藏代码
  1. // 假设现在要创建这样一个json文本  
  2. //  {  
  3. //      "phone" : ["12345678", "87654321"], // 数组  
  4. //      "name" : "yuanzhifei89", // 字符串  
  5. //      "age" : 100, // 数值  
  6. //      "address" : { "country" : "china", "province" : "jiangsu" }, // 对象  
  7. //      "married" : false // 布尔值  
  8. //  }  
  9.   
  10. try {  
  11.     // 首先最外层是{},是创建一个对象  
  12.     JSONObject person = new JSONObject();  
  13.     // 第一个键phone的值是数组,所以需要创建数组对象  
  14.     JSONArray phone = new JSONArray();  
  15.     phone.put("12345678").put("87654321");  
  16.     person.put("phone", phone);  
  17.   
  18.     person.put("name""yuanzhifei89");  
  19.     person.put("age"100);  
  20.     // 键address的值是对象,所以又要创建一个对象  
  21.     JSONObject address = new JSONObject();  
  22.     address.put("country""china");  
  23.     address.put("province""jiangsu");  
  24.     person.put("address", address);  
  25.   
  26.     person.put("married"false);  
  27. catch (JSONException ex) {  
  28.     // 键为null或使用json不支持的数字格式(NaN, infinities)  
  29.     throw new RuntimeException(ex);  
  30. }  

getType和optType api的使用 
getType可以将要获取的键的值转换为指定的类型,如果无法转换或没有值则抛出JSONException 

optType也是将要获取的键的值转换为指定的类型,无法转换或没有值时返回用户提供或这默认提供的值 
Java代码   收藏代码
  1. try {  
  2.     // 所有使用的对象都是用上面创建的对象  
  3.     // 将第一个电话号码转换为数值和将名字转换为数值  
  4.     phone.getLong(0);  
  5.     person.getLong("name"); // 会抛异常,因为名字无法转换为long  
  6.       
  7.     phone.optLong(0); // 代码内置的默认值  
  8.     phone.optLong(01000); // 用户提供的默认值  
  9.     person.optLong("name");  
  10.     person.optLong("name"1000); // 不像上面那样抛异常,而是返回1000  
  11. catch (JSONException ex) {  
  12.     // 异常处理代码  
  13. }  


除了上面的两个类,还可以使用JSONStringer来构建json文本 
Java代码   收藏代码
  1. try {  
  2.     JSONStringer jsonText = new JSONStringer();  
  3.     // 首先是{,对象开始。object和endObject必须配对使用  
  4.     jsonText.object();  
  5.       
  6.     jsonText.key("phone");  
  7.     // 键phone的值是数组。array和endArray必须配对使用  
  8.     jsonText.array();  
  9.     jsonText.value("12345678").value("87654321");  
  10.     jsonText.endArray();  
  11.       
  12.     jsonText.key("name");  
  13.     jsonText.value("yuanzhifei89");  
  14.     jsonText.key("age");  
  15.     jsonText.value(100);  
  16.       
  17.     jsonText.key("address");  
  18.     // 键address的值是对象  
  19.     jsonText.object();  
  20.     jsonText.key("country");  
  21.     jsonText.value("china");  
  22.     jsonText.key("province");  
  23.     jsonText.value("jiangsu");  
  24.     jsonText.endObject();  
  25.       
  26.     jsonText.key("married");  
  27.     jsonText.value(false);  
  28.       
  29.     // },对象结束  
  30.     jsonText.endObject();  
  31. catch (JSONException ex) {  
  32.     throw new RuntimeException(ex);  
  33. }  


json文本解析类JSONTokener 
按照RFC4627规范将json文本解析为相应的对象。 

对于将json文本解析为对象,只需要用到该类的两个api: 
构造函数 
public Object nextValue(); 
Java代码   收藏代码
  1. //  {  
  2. //      "phone" : ["12345678", "87654321"], // 数组  
  3. //      "name" : "yuanzhifei89", // 字符串  
  4. //      "age" : 100, // 数值  
  5. //      "address" : { "country" : "china", "province" : "jiangsu" }, // 对象  
  6. //      "married" : false // 布尔值  
  7. //  }  
  8.   
  9. private static final String JSON =   
  10. "{" +  
  11.     "   \"phone\" : [\"12345678\", \"87654321\"]," +  
  12.     "   \"name\" : \"yuanzhifei89\"," +  
  13.     "   \"age\" : 100," +  
  14.     "   \"address\" : { \"country\" : \"china\", \"province\" : \"jiangsu\" }," +  
  15.     "   \"married\" : false," +  
  16. "}";  
  17.   
  18. try {  
  19.     JSONTokener jsonParser = new JSONTokener(JSON);  
  20.     // 此时还未读取任何json文本,直接读取就是一个JSONObject对象。  
  21.     // 如果此时的读取位置在"name" : 了,那么nextValue就是"yuanzhifei89"(String)  
  22.     JSONObject person = (JSONObject) jsonParser.nextValue();  
  23.     // 接下来的就是JSON对象的操作了  
  24.     person.getJSONArray("phone");  
  25.     person.getString("name");  
  26.     person.getInt("age");  
  27.     person.getJSONObject("address");  
  28.     person.getBoolean("married");  
  29. catch (JSONException ex) {  
  30.     // 异常处理代码  
  31. }  


其它的api基本就是用来查看json文本中的文本的 
Java代码   收藏代码
  1. try {  
  2.     JSONTokener jsonParser = new JSONTokener(JSON);  
  3.     // 继续向下读8个json文本中的字符。此时刚开始,即在{处  
  4.     jsonParser.next(8); //{    "phone。tab算一个字符  
  5.       
  6.     // 继续向下读1个json文本中的字符  
  7.     jsonParser.next(); //"  
  8.       
  9.     // 继续向下读取一个json文本中的字符。该字符不是空白、同时也不是注视中的字符  
  10.     jsonParser.nextClean(); //:  
  11.       
  12.     // 返回当前的读取位置到第一次遇到'a'之间的字符串(不包括a)。  
  13.     jsonParser.nextString('a'); //  ["12345678", "87654321"],    "n(前面有两个空格)  
  14.       
  15.     // 返回当前读取位置到第一次遇到字符串中(如"0089")任意字符之间的字符串,同时该字符是trimmed的。(此处就是第一次遇到了89)  
  16.     jsonParser.nextTo("0089"); //me" : "yuanzhifei  
  17.       
  18.     // 读取位置撤销一个  
  19.     jsonParser.back();  
  20.     jsonParser.next(); //i  
  21.       
  22.     // 读取位置前进到指定字符串处(包括字符串)  
  23.     jsonParser.skipPast("address");  
  24.     jsonParser.next(8); //" : { "c  
  25.       
  26.     // 读取位置前进到执行字符处(不包括字符)  
  27.     jsonParser.skipTo('m');  
  28.     jsonParser.next(8); //married"  
  29. catch (JSONException ex) {  
  30.     // 异常处理代码  
  31. }  


json中的null和java中的null注意: 
Java代码   收藏代码
  1. // json对象的成员为null可能有两种情况:  
  2. // 1: 不出现该成员的名称(对应java中的null)  
  3. // 2: 成员值为null。(对应java中的JSONObject.NULL)  
  4.   
  5. // 完整的Json  
  6. //  {    
  7. //      "phone" : ["12345678", "87654321"], // 数组    
  8. //      "name" : "yuanzhifei89", // 字符串    
  9. //      "age" : 100, // 数值    
  10. //      "address" : { "country" : "china", "province" : "jiangsu" }, // 对象    
  11. //      "married" : false // 布尔值    
  12. //  }    
  13.   
  14. // 第一种情况:不出现某成员的名称(address)  
  15. String jsonText = "{" +    
  16.     "   \"phone\" : [\"12345678\", \"87654321\"]," +    
  17.     "   \"name\" : \"yuanzhifei89\"," +    
  18.     "   \"age\" : 100," +    
  19.     "   \"married\" : false," +    
  20. "}";   
  21.   
  22. try {  
  23.     JSONTokener t = new JSONTokener(jsonText);  
  24.     JSONObject obj = (JSONObject) t.nextValue();  
  25.     if (obj.optJSONObject("address") == null || obj.isNull("address")) {  
  26.     }  
  27. catch (JSONException ex) {  
  28.     ex.printStackTrace();  
  29. }  
  30.   
  31. // 第二种情况:成员值为null(address为null)  
  32. String jsonText = "{" +    
  33.     "   \"phone\" : [\"12345678\", \"87654321\"]," +    
  34.     "   \"name\" : \"yuanzhifei89\"," +    
  35.     "   \"age\" : 100," +    
  36.     "   \"address\" : null," +    
  37.     "   \"married\" : false," +    
  38. "}";   
  39. try {  
  40.     JSONTokener t = new JSONTokener(jsonText);  
  41.     JSONObject obj = (JSONObject) t.nextValue();  
  42.       
  43.     // 应该这样判断json是否为null  
  44.     if (obj.get("address") == JSONObject.NULL || obj.isNull("address")) {  
  45.     }  
  46. catch (JSONException ex) {  
  47.     ex.printStackTrace();  
  48. }  


json中的对象不存在和java中的对应关系 
Java代码   收藏代码
  1. json中的null对应java中的JSONObject.NULL,所以jsonObj.put("key", JSONObject.NULL) 相当于{"key" : null}  
  2.   
  3. json中的不出现某成员对应Java中的null,所以jsonObj.put("key"null)相当于删除该成员,即:{}  


  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值