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 运行结果

转自:链接

JSON数据解析(GSON方式) (转)的更多相关文章

  1. jQuery AJAX获取JSON数据解析多种方式示例

    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...

  2. Android JSON数据解析(GSON方式)

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

  3. 使用Gson轻松解决复杂结构的Json数据解析

    转载请注明来源: http://blog.csdn.net/kjunchen/article/details/50961803 JSON简介 JSON(JavaScript Object Notati ...

  4. Android学习笔记之JSON数据解析

    转载:Android学习笔记44:JSON数据解析 JSON(JavaScript Object Notation)是一种轻量级的数据交换格式,采用完全独立于语言的文本格式,为Web应用开发提供了一种 ...

  5. Android的JSON数据解析

    一. 使用原生方式解析 准备工作:准备一个布局文件,用来显示元数据与转换之后的数据 <?xml version="1.0" encoding="utf-8" ...

  6. iOS - JSON 数据解析

     iOS - JSON 数据解析 前言 NS_CLASS_AVAILABLE(10_7, 5_0) @interface NSJSONSerialization : NSObject @availab ...

  7. iOS开发笔记3:XML/JSON数据解析

    这篇主要总结在iOS开发中XML/JSON数据解析过程用到的方法.XML数据解析主要使用SAX方式的NSXMLParser以及DOM方式的GDataXML,JSON数据解析主要使用NSJSONSeri ...

  8. Silverlight项目笔记7:xml/json数据解析、TreeView、引用类型与数据绑定错误、图片加载、虚拟目录设置、silverlight安全机制引发的问题、WebClient缓存问题

    1.xml/json数据解析 (1)xml数据解析 使用WebClient获取数据,获取到的数据实例化为一个XDocument,使用XDocument的Descendants(XName)方法获得对应 ...

  9. Android网络之数据解析----SAX方式解析XML数据

    ​[声明] 欢迎转载,但请保留文章原始出处→_→ 生命壹号:http://www.cnblogs.com/smyhvae/ 文章来源:http://www.cnblogs.com/smyhvae/p/ ...

随机推荐

  1. python: extend (扩展) 与 append (追加) 的差别

    >>> li = ['a', 'b', 'c'] >>> li.extend(['d', 'e', 'f']) >>> li ['a', 'b', ...

  2. 79 两个整数集合A和B,求其交集

    [本文链接] http://www.cnblogs.com/hellogiser/p/ab-intersect.html [题目] 两个整数集合A和B,求其交集. [分析]   1. 读取整数集合A中 ...

  3. zpf框架的business使用方法

    2015年3月9日 10:58:42 controller 是接受数据分派任务的地方 model 接收controller来的数据, 获取并处理数据库中的数据, 然后再返回给controller 的业 ...

  4. WPS Office文档未保存怎么恢复

    有时候用WPS Office时,文档还没保存,因为电脑卡死或者关机,再次打开时编辑的内容都不见了,这个时候可以利用WPS自带的备份功能来恢复文档,表格.幻灯片.文档都是可以的. 首先单击WPS左上角的 ...

  5. ACM/ICPC 之 DFS范例(ZOJ2412-ZOJ1008)

    通过几道例题简单阐述一下DFS的相关题型 ZOJ2412-Farm Irrigation 直观的DFS题型,稍加变化,记录好四个方向上的通路就能够做出来 题目和接水管类似,问最少要灌溉几次,即求解最少 ...

  6. java 入门 第三季1

    异常和异常体系 java异常体系 throwable:error:线程死锁,内存溢出 excepiton:rumtimeException运行时异常:非检查异常 检查异常:文件异常IOExceptio ...

  7. iOS基础框架的搭建/国际化操作

    1.基础框架的搭建 1.1 pod引入常用的第三方类库 1.2 创建基础文件夹结构/目录结构 Resource———存放声音/图片/xib/storyboard 等资源文件 Define——宏定义, ...

  8. nyoj_148_fibonacci数列(二)_矩阵快速幂

    fibonacci数列(二) 时间限制:1000 ms  |  内存限制:65535 KB 难度:3   描述 In the Fibonacci integer sequence, F0 = 0, F ...

  9. 如何让两个 并列的div高度相等

    哪个div Height值大,就将其值赋给Height值小的div,从而使2个div高度始终保持一致. function $(id){ return document.getElementById(i ...

  10. chaper3_exerise_Uva1225_digit_counting

    #include<iostream> #include<stdio.h> #include<cstring> using namespace std; ; int ...