首页 > 代码库 > Gson的使用
Gson的使用
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); //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)生成
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)解析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 = "http://www.mamicode.com/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
Gson的使用