GSON:是Google開發的Java API,用於轉換Java對象和Json對象java
<dependency> <groupId>com.google.code.gson</groupId> <artifactId>gson</artifactId> <version>2.7</version> </dependency>
Gson提供了fromJson()
和toJson()
兩個直接用於解析和生成的方法,前者實現反序列化,後者實現了序列化。同時每一個方法都提供了重載方法。json
1.基本數據類型的生成與解析數組
(1)解析google
Gson gson = new Gson(); int i = gson.fromJson("100", int.class); //100 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)生成spa
Gson gson = new Gson(); String jsonNumber = gson.toJson(100); // 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)解析Jsoncode
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.屬性重命名註解的使用blog
@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