Android_json

来源:互联网 发布:高清网络智能机顶盒 编辑:程序博客网 时间:2024/06/05 05:19

Android之Gson

{

"id": 912345678901,

"age": 33, 

"text": "How do I stream JSON in Java?",

"geo": null,
 }


红色部分如果表示有可能为null,则在判断的时候需要如下name.equals("geo")&& reader.peek() != JsonToken.NULL

橙色部分要是想不解析其中的Json字段,需要在判断的时候加上一个else语句如下:else{reader.skipValue()} 

 

然后是一些例子,都是Json的各种组合形式,不定时更新 

1. 现实Json数据,后面每一个都是如此不再做任何的解析了,然后跟着就是对应的代码内容

 {

     "id": 912345678901,
     "text": "How do I stream JSON in Java?",
     "geo": null,
     "user": {
       "name": "json_newb",
       "followers_count": 41
      }
}
复制代码
    reader.beginObject();
            while (reader.hasNext()) {
                String name = reader.nextName();
                if (name.equals("id")) {
                    System.out.println("id:" + reader.nextLong());
                } else if (name.equals("text")) {
                    System.out.println("text:" + reader.nextString());
                } else if (name.equals("geo") && reader.peek() != JsonToken.NULL) {
                    System.out.println("text:" + reader.nextString());
                } else if (name.equals("user")) {
                    usernameObject();
                } else {
                    reader.skipValue();
                }
            }
            reader.endObject();

private void usernameObject() throws IOException{
        reader.beginObject();
        while (reader.hasNext()) {
            String nxtName = reader.nextName();
            if (nxtName.equals("name")) {
                System.out.println("nxtName:" + reader.nextString());
            } else if (nxtName.equals("followers_count")) {
                System.out.println("nxtName:" + reader.nextInt());
            }

}  

复制代码

        

2.

[
{
     "id": 912345678901,
     "text": "How do I stream JSON in Java?",
     "geo": null,
     "user": {
       "name": "json_newb",
       "followers_count": 41
      }
},
{
     "id": 777777777888,
     "text": "dfngsdnglnsldfnsl",
     "geo": null,
     "user": {
       "name": "dsfgpd",
       "followers_count": 24
      }
}

复制代码
reader.beginArray();
        while(reader.hasNext()){
            reader.beginObject();
            while (reader.hasNext()) {
                String name = reader.nextName();
                if (name.equals("id")) {
                    System.out.println("id:" + reader.nextLong());
                } else if (name.equals("text")) {
                    System.out.println("text:" + reader.nextString());
                } else if (name.equals("geo") && reader.peek() != JsonToken.NULL) {
                    System.out.println("text:" + reader.nextString());
                } else if (name.equals("user")) {
                    usernameObject();
                } else {
                    reader.skipValue();
                }
            }
            reader.endObject();
        }

reader.endArray();  

复制代码

        

3. 

{
"statuses":[
{
      "id": 912345678901,
      "text": "How do I stream JSON in Java?",
      "geo": null,
      "user": {
        "name": "json_newb",
        "followers_count": 41
       }
       },
      
{
      "id": 777777777888,
      "text": "dfngsdnglnsldfnsl",
      "geo": null,
      "user": {
        "name": "dsfgpd",
        "followers_count": 24
       }
       }
     ]

复制代码
reader.beginObject();
        while(reader.hasNext())
        { 
            String begin = reader.nextName();
            if(begin.equals("statuses"))
            {
                array();
            }
        }
        reader.endObject();

private void array() throws IOException{
        reader.beginArray();
        while(reader.hasNext()){
            reader.beginObject();
            while (reader.hasNext()) {
                String name = reader.nextName();
                if (name.equals("id")) {
                    System.out.println("id:" + reader.nextLong());
                } else if (name.equals("text")) {
                    System.out.println("text:" + reader.nextString());
                } else if (name.equals("geo") && reader.peek() != JsonToken.NULL) {
                    System.out.println("text:" + reader.nextString());
                } else if (name.equals("user")) {
                    usernameObject();
                } else {
                    reader.skipValue();
                }
            }
            reader.endObject();
        }
        reader.endArray();
    }

private void usernameObject() throws IOException{
        reader.beginObject();
        while (reader.hasNext()) {
            String nxtName = reader.nextName();
            if (nxtName.equals("name")) {
                System.out.println("nxtName:" + reader.nextString());
            } else if (nxtName.equals("followers_count")) {
                System.out.println("nxtName:" + reader.nextInt());
            }
        }
        reader.endObject();

  }  

复制代码

  JSON(JavaScript Object Notation)是一种轻量级的数据交换格式,采用完全独立于语言的文本格式,为Web应用开发提供了一种理想的数据交换格式。

  本文将主要介绍在Android开发中,如何在服务器端创建JSON数据,以及如何在Android客户端对JSON数据进行解析。

 

1.JSON数据结构

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

1.1对象

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

图1 JSON对象结构示意图

  如下的代码是一个简单的JSON对象示例:

1   {2   "id":001,3   "name":"jack",4   "age":255   }

1.2数组

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

图2 JSON数组结构示意图

  如下的代码是一个简单的JSON数组示例:

  ["北京","上海","广州"]

1.3值的类型

  在JSON的对象和数组结构中,value值不仅可以是数字、字符串等简单数据类型,还可以是对象、数组等,如图3所示。

图3 JSON中值的类型

  因此,我们可以使用对象和数组的组合构成复杂的数据结构。如下的代码使用对象结构定义了一个“students”对象,在“students”对象中包含了一个学生数组,而学生数组中的值又是JSON对象。

复制代码
1     {2         "students":3         [4         {"name":"jack","age":23},5         {"name":"rose","age":24}6         ]7     }
复制代码

 

2.在服务器端生成JSON数据

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

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

  (1)我们需要使用MyEclipse创建了一个Web Project,这里我将该工程命名为了“JsonDemoProject”,用来模拟服务器端的Web服务。

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

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

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

复制代码
 1   public class JsonTools { 2        3       /* 4        * Function :   生成JSON数据 5        * Param   :  key        Json数据的键值 6        *              object     要生成Json数据的内容 7        * Retuen  :   JSON数据 8        * Author  :   博客园-依旧淡然 9        */10       public static String createJsonString(String key, Object value) {11           JSONObject jsonObject = new JSONObject();    //创建一个JSONObject对象12           jsonObject.put(key, value);                  //往JSONObject对象中填入内容13           return jsonObject.toString();                //生成JSON数据并返回14       }15       16   }
复制代码

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

复制代码
 1     /* 2      * Function :   获取Person对象列表 3      * Author  :   博客园-依旧淡然 4      */ 5     public List<Person> getListPerson() { 6         List<Person> list = new ArrayList<Person>(); 7         Person person1 = new Person(001, "jack", 25); 8         Person person2 = new Person(002, "rose", 24); 9         Person person3 = new Person(003, "bob", 26);10         list.add(person1);11         list.add(person2);12         list.add(person3);13         return list;14     }
复制代码

  其中,Person对象具有id(int)、name(String)和age(int)三个属性。

  最后,我们可以创建一个继承自HttpServlet的JsonAction类,并实现其中的doPost()方法,用来响应客户端对服务器的请求。具体如下:

复制代码
 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数据。

图4 生成的JSON数据

 

3.在客户端解析JSON数据

  通过上面的步骤,我们已经在服务器上生成了JSON数据。要在我们的Android工程中获取该JSON数据是很容易的,只需要利用Android为我们提供的HttpURLConnection接口访问图4所示的URL即可。

  那么,获取到服务器上的JSON数据以后,如何在Android工程中完成对该JSON数据的解析呢?

  观察图4所示的JSON数据可以看出:

  (1)该JSON数据的最外层是JSONObject,JSONObject的键是“persons”,值是一个JSONArray。

  (2)在JSONArray中又包含了3个JSONObject对象。

  (3)而在内嵌的每一个JSONObject对象中,都有3个键值对的组合。

  分析清楚了JSON数据的构成形式之后,就可以开始着手对其进行解析了。在Android工程中,我们可以创建一个JsonTools类,并实现getListPerson()类方法,用来完成把从服务器获得的Json数据解析出来,还原成Person对象列表。具体代码如下所示:

复制代码
 1     /* 2      * Function  :   解析JSON数据,还原成Person对象列表 3      * Param     :   key            Json数据的键值 4      *               jsonString     从服务器获得的Json数据 5      * Retuen   :   Person对象列表 6      * Author    :   博客园-依旧淡然 7      */ 8     public static List<Person> getListPerson(String key, String jsonString) { 9         List<Person> list = new ArrayList<Person>();10         try {11             JSONObject jsonObject = new JSONObject(jsonString);          //创建JSONObject对象12             JSONArray personArray = jsonObject.getJSONArray(key);        //获取JSONObject对象的值,该值是一个JSON数组13             for(int i = 0; i < personArray.length(); i++) {14                 JSONObject personObject = personArray.getJSONObject(i);  //获得JSON数组中的每一个JSONObject对象15                 Person person = new Person();16                 int id = personObject.getInt("id");                      //获得每一个JSONObject对象中的键所对应的值17                 String name = personObject.getString("name");18                 int age = personObject.getInt("age");19                 person.setId(id);        //将解析出来的属性值存入Person对象20                 person.setName(name);21                 person.setAge(age);22                 list.add(person);        //将解析出来的每一个Person对象添加到List中23             }24         } catch (JSONException e) {25             e.printStackTrace();26         }27         return list;28     }
复制代码

  在本实例中,点击Button按钮向服务器发送获取JSON数据的请求,从服务器获得JSON数据后,可以使用以上的代码完成对JSON数据的解析,最后将解析得到的Person对象依次显示在TextView控件中。程序运行的结果如图5所示。



 JSON(JavaScript Object Notation)是一种轻量级的数据交换格式,采用完全独立于语言的文本格式,为Web应用开发提供了一种理想的数据交换格式。 

 

  其实,要创建和解析JSON数据,也可以使用GSON来完成。GSON是Google提供的用来在Java对象和JSON数据之间进行映射的Java类库。使用GSON,可以很容易的将一串JSON数据转换为一个Java对象,或是将一个Java对象转换为相应的JSON数据。 

 

1.GSON的两个重要方法

  在GSON的API中,提供了两个重要的方法:toJson()和fromJson()方法。其中,toJson()方法用来实现将Java对象转换为相应的JSON数据,fromJson()方法则用来实现将JSON数据转换为相应的Java对象。

1.1 toJson()方法

  toJson()方法用于将Java对象转换为相应的JSON数据,主要有以下几种形式:

  (1)String toJson(JsonElement jsonElement);

  (2)String toJson(Object src);

  (3)String toJson(Object src, Type typeOfSrc);

  其中,方法(1)用于将JsonElement对象(可以是JsonObject、JsonArray等)转换成JSON数据;方法(2)用于将指定的Object对象序列化成相应的JSON数据;方法(3)用于将指定的Object对象(可以包括泛型类型)序列化成相应的JSON数据。

1.2 fromJson()方法

  fromJson()方法用于将JSON数据转换为相应的Java对象,主要有以下几种形式:

  (1)<T> T fromJson(JsonElement json, Class<T> classOfT);

  (2)<T> T fromJson(JsonElement json, Type typeOfT);

  (3)<T> T fromJson(JsonReader reader, Type typeOfT);

  (4)<T> T fromJson(Reader reader, Class<T> classOfT);

  (5)<T> T fromJson(Reader reader, Type typeOfT);

  (6)<T> T fromJson(String json, Class<T> classOfT);

  (7)<T> T fromJson(String json, Type typeOfT);

  以上的方法用于将不同形式的JSON数据解析成Java对象。

 

2.在服务器端生成JSON数据

  要使用GSON技术在服务器端生成JSON数据,首先需要完成以下两个准备工作。

  (1)使用MyEclipse创建了一个Web Project,这里我将该工程命名为了“GsonDemoProject”,用来模拟服务器端的Web服务。 

  (2)往该工程中导入GSON的API数据包gson-2.2.1.jar。 

  然后,我们便可以在该工程中创建一个JsonTools工具类,并实现静态方法createJsonString(),在该方法中通过使用GSON技术来生成JSON数据。该方法的具体实现如下。

复制代码
 1   public class JsonTools { 2        3       /* 4        * Function :   生成JSON字符串 5        * Param   :   value     想要转换成JSON字符串的Object对象 6        * Retuen  :   JSON字符串 7        * Author  :   博客园-依旧淡然 8        */ 9       public static String createJsonString(Object value) {10           Gson gson = new Gson();11           String string = gson.toJson(value);12           return string;13       }14       15   }
复制代码

  可以看到,这个方法的具体实现非常简单,首先创建一个Gson对象,然后通过调用Gson对象的toJson()方法,将传进来的value(任意的Java对象)转换成JSON字符串即可。

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

复制代码
 1     /* 2      * Function :  获取Person对象列表 3      * Author  :  博客园-依旧淡然 4      */ 5     public List<Person> getListPerson() { 6         List<Person> list = new ArrayList<Person>(); 7         Person person1 = new Person(001, "jack", 25); 8         Person person2 = new Person(002, "rose", 24); 9         Person person3 = new Person(003, "bob", 26);10         list.add(person1);11         list.add(person2);12         list.add(person3);13         return list;14     }
复制代码

  在该方法中,我们向List列表中加入了3个Person对象,每个Person对象具有id(int)、name(String)和age(int)三个属性。

  最后,我们还需要创建一个继承自HttpServlet的JsonAction类,并实现其中的doPost()方法,用来响应客户端对服务器的请求。具体如下:

复制代码
 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");13         if(action_flag.equals("persons") {14             str = JsonTools.createJsonString(listPerson);15         }16         out.println(str);17         out.flush();18         out.close();19     }
复制代码

  在该方法中,我们通过调用JsonService类中的getListPerson()方法获得了Person对象列表listPerson,并将其传入JsonTools.createJsonString()方法中,生成了Person对象列表的JSON数据。将该工程发布到Tomcat上,使用浏览器访问该Web工程,可以看到如图1所示的界面,Person对象列表被成功的转化成了JSON数据。

图1 生成的JSON数据

 

3.在客户端解析JSON数据

  在Android工程中,我们可以通过HttpURLConnection接口访问图1所示的URL来获得服务器上的JSON数据。

  得到JSON数据之后,便可以通过使用前面提到的fromJson()方法,将图1 所示的JSON数据还原成对应的Person对象列表了。当然了,因为这里使用到了GSON,同样需要向Android工程中导入gson-2.2.1.jar包。具体的实现方法如下。

复制代码
 1     /* 2      * Function  :   解析JSON数据,还原成Person对象列表 3      * Param     :   jsonString         从服务器获得的Json数据 4      * Retuen   :   Person对象列表 5      * Author    :   博客园-依旧淡然 6      */ 7     public static List<Person> getListPerson(String jsonString) { 8         List<Person> list = new ArrayList<Person>(); 9         Gson gson = new Gson();10         list = gson.fromJson(jsonString, new TypeToken<List<Person>>(){}.getType());11         return list;12     }
复制代码

  可以看到,使用GSON解析JSON数据的代码实现也非常简单。其中,TypeToken是GSON提供的数据类型转换器,支持多种数据集合类型转换,其反射机制可以实现将解析出来的Java对象映射到对应的数据集合中。

  在本实例中,同样点击Button按钮向服务器发送获取JSON数据的请求,从服务器获得JSON数据后,使用以上的代码完成对JSON数据的解析,最后将解析得到的Person对象依次显示在TextView控件中。程序运行的结果如图2所示。

图2 运行结果


0 0