zoukankan      html  css  js  c++  java
  • Android学习笔记45:JSON数据解析(GSON方式)

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

      在上一篇博文《Android学习笔记44:JSON数据解析》中,我们使用基本的JSON API完成了在服务器端创建JSON数据,以及在Android客户端对JSON数据进行解析。 

      其实,要创建和解析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 运行结果

    作者:依旧淡然
    邮箱:menlsh@163.com
    本文版权归作者所有,未经作者同意,严禁转载及用作商业传播,否则将追究法律责任。
  • 相关阅读:
    面向对象编程总结Python
    垃圾收集器与内存分配策略
    自定义异常、异常处理注意点
    关于线程【一】——线程创建、停止、interrupted()和isInterrupted()区别
    Java内存区域
    HotSpot虚拟机对象
    异常——try、catch、finally、throw、throws
    关于线程【二】——线程同步和异步
    fillder代理调试
    新鲜出炉的Asp.Net MVC电子书
  • 原文地址:https://www.cnblogs.com/menlsh/p/3087810.html
Copyright © 2011-2022 走看看