GSON:是Google开发的Java API,用于转换Java对象和Json对象

<dependency>
<groupId>com.google.code.gson</groupId>
<artifactId>gson</artifactId>
<version>2.7</version>
</dependency>

Gson提供了fromJson()toJson() 两个直接用于解析和生成的方法,前者实现反序列化,后者实现了序列化。同时每个方法都提供了重载方法。

1.基本数据类型的生成与解析

(1)解析

Gson gson = new Gson();
int i = gson.fromJson("100", int.class); //
double d = gson.fromJson("\"99.99\"", double.class); //99.99
boolean b = gson.fromJson("true", boolean.class); // true
String str = gson.fromJson("String", String.class); // String

(2)生成

Gson gson = new Gson();
String jsonNumber = gson.toJson(100); //
String jsonBoolean = gson.toJson(false); // false
String jsonString = gson.toJson("String"); //"String"

2.POJO类的生成与解析

public class User {
//省略其它
public String name;
public int age;
public String emailAddress;
}

(1)解析Json

Gson gson = new Gson();
String jsonString = "{\"name\":\"怪盗kidou\",\"age\":24}";
User user = gson.fromJson(jsonString, User.class);

(2)生成Json

Gson gson = new Gson();
User user = new User("怪盗kidou",24);
String jsonObject = gson.toJson(user); // {"name":"怪盗kidou","age":24}

3.属性重命名注解的使用

@SerializedName(value = "emailAddress", alternate = {"email", "email_address"})
public String emailAddress;

当上面的三个属性(email_address、email、emailAddress)中出现任意一个时均可以得到正确的结果。

4.Gson中使用泛型

例:JSON字符串数组 ["Android","Java","PHP"]

当我们要通过Gson解析这个json时,一般有两种方式:使用数组,使用List。而List对于增删都是比较方便的,所以实际使用是还是List比较多。

数组比较简单:

Gson gson = new Gson(); 
String jsonArray = "[\"Android\",\"Java\",\"PHP\"]";
String[] strings = gson.fromJson(jsonArray, String[].class);

但对于List将上面的代码中的 String[].class 直接改为 List<String>.class 是行不通的。对于Java来说List<String> 和List<User> 这俩个的字节码文件只一个那就是List.class,这是Java泛型使用时要注意的问题 泛型擦除。 为了解决的上面的问题,Gson为我们提供了TypeToken来实现对泛型的支持,所以当我们希望使用将以上的数据解析为List<String>时需要这样写。

Gson gson = new Gson();
String jsonArray = "[\"Android\",\"Java\",\"PHP\"]";
String[] strings = gson.fromJson(jsonArray, String[].class);
List<String> stringList = gson.fromJson(jsonArray, new TypeToken<List<String>>() {}.getType());

注:TypeToken的构造方法是protected修饰的,所以上面才会写成new TypeToken<List<String>>() {}.getType() 而不是  new TypeToken<List<String>>().getType()

泛型解析对接口POJO的设计影响泛型的引入可以减少无关的代码,如我现在所在公司接口返回的数据分为两类:

{"code":"0","message":"success","data":{}}
{"code":"0","message":"success","data":[]}

我们真正需要的data所包含的数据,而code只使用一次,message则几乎不用。如果Gson不支持泛型或不知道Gson支持泛型的同学一定会这么定义POJO。

public class UserResponse {
public int code;
public String message;
public User data;
}

当其它接口的时候又重新定义一个XXResponse将data的类型改成XX,很明显code,和message被重复定义了多次,通过泛型的话我们可以将code和message字段抽取到一个Result的类中,这样我们只需要编写data字段所对应的POJO即可,更专注于我们的业务逻辑。如:

public class Result<T> {
public int code;
public String message;
public T data;
}

那么对于data字段是User时则可以写为 Result<User> ,当是个列表的时候为 Result<List<User>>,其它同理。

如Result.java:

import com.alibaba.fastjson.JSONObject;
import java.util.HashMap;
import java.util.List;
import java.util.Map; public class Result<T> {
public Map success(Object data) {
Map<String, Object> map = new HashMap<>();
map.put("code", ResultStatus.SUCCESS);
map.put("message", "process successfully!");
map.put("data", data);
return map;
} public Map success(List<T> data) {
Map<String, Object> map = new HashMap<>();
map.put("status", "success");
map.put("msg", "process successfully!");
map.put("data", data);
return map;
} public Map success(List<T> data, JSONObject additional) {
Map<String, Object> map = new HashMap<>();
map.put("status", "success");
map.put("msg", "process successfully!");
map.put("data", data);
map.put("additional", additional);
return map;
} public Map fail(String msg) {
Map<String, Object> map = new HashMap<>();
map.put("status", "failure");
map.put("msg", msg);
map.put("data", "");
return map;
} public Map result(ResultStatus status, String msg, Object data) {
Map<String, Object> map = new HashMap<>();
if (status.getName().equals("success")) {
map.put("status", "success");
} else {
map.put("status", "failure");
}
map.put("msg", msg);
map.put("data", data);
return map;
}
}

5.Gson的流式反序列化

Gson.toJson(Object);
Gson.fromJson(Reader,Class);
Gson.fromJson(String,Class);
Gson.fromJson(Reader,Type);
Gson.fromJson(String,Type);

原文链接:http://www.jianshu.com/p/e740196225a4

最新文章

  1. HTML5 与 CSS3 jQuery部分知识总结【转】
  2. java中类继承,到底继承了什么?
  3. Java命名约定
  4. UESTC 917 方老师的分身IV --求欧拉路径
  5. IIS7下,flush无效,解决方案
  6. SOA之(1)——SOA架构基础概念
  7. 进程内核栈、用户栈及 Linux 进程栈和线程栈的区别
  8. ASP.NET运行原理_2
  9. C++沉思录之一
  10. Oracle 中包的应用
  11. bootstarp(carousel)组件
  12. Laravel创建Model
  13. Linux下使用Photorec恢复误格U盘
  14. Mysql的热备份[转载]
  15. Entity Framework快速入门--ModelFirst
  16. Floyd 算法求多源最短路径
  17. 第25月第2天 Django-By-Example项目记录01
  18. Spark启动时的master参数以及Spark的部署方式
  19. Codeforces Gym100187C Very Spacious Office 贪心 堆
  20. hdu 2059龟兔赛跑(&quot;01&quot;背包)

热门文章

  1. Rally的敏捷小册子
  2. Linux mint 18版本开启SSH服务
  3. jQuery:cookie插件的使用
  4. 安装在CloudStack时CentOS6.4中安装MySQL通过mysql_secure_installation方式修改密码
  5. (整理) JQuery中的AJAX
  6. gruntjs
  7. Scala笔记整理
  8. JS的字符串处理
  9. 跳过IE10安装VS2013
  10. mfc 调用Windows的API函数实现同步异步串口通信(源码)