Gson是google 官方出品的json解析库,通过gson你可以方便的操作json数据,以下通过从 解析json数据和封装json数据来说明一下它的厉害之处。
json数据解析:
首先如果我们面对一个简单的json 数据:如下所示:
{ "age": 18, "name": "jack", "address": "china", "phoneNum": "13120457560" }
按照java 自带的json解析工具 我们要挨个的 利用jsonobject.getString()或者getInt来进行解析还要再封装成我们需要的对象。
JSONObject obj = new JSONObject(json); UserEntity entity = new UserEntity(); entity.setAddress(obj.getString("address")); entity.setAge(obj.getInt("age")); entity.setName(obj.getString("name")); entity.setPhoneNum(obj.getString("phoneNum"));
而我们来看Gson对于该数据的解析方法
Gson gson = new Gson(); UserEntity user = gson.fromJson(json, UserEntity.class);
两行代码就搞定了。是不是很爽。
接下来我们再看一下复杂的数据格式解析:
{ [ { "age": 18, "name": "jack", "address": "china", "phoneNum": "13120457560" }, { "age": 18, "name": "jack", "address": "china", "phoneNum": "13120457560" } ] }
可以看到上面的json数据中包括一个数组,按照正常的org.json的解析方式为:
List<UserEntity> entityArray = new ArrayList<UserEntity>(); JSONArray array = new JSONArray(json); for (int i = 0; i < array.length(); i++) { JSONObject obj = array.getJSONObject(i); UserEntity entity = new UserEntity(); entity.setAddress(obj.getString("address")); entity.setAge(obj.getInt("age")); entity.setName(obj.getString("name")); entity.setPhoneNum(obj.getString("phoneNum")); entityArray.add(entity); }
而gson的解析方式为
Gson gson = new Gson(); List<UserEntity> people = gson.fromJson(json, new TypeToken<List<UserEntity>>() { }.getType());
是的 依然是两行代码搞定,这个地方需要说明一下 gson.fromJson(json,new TypeToken<>(){}.getType()) 第二个参数 其实就是通过typetoken 将java对象转换为json对象,typetoken内部是通过泛型来实现数据类型转换的对于list这种属于泛型的必须使用这种形式,请看官方文档说明:
/** * This method serializes the specified object, including those of generic types, into its * equivalent Json representation. This method must be used if the specified object is a generic * type. For non-generic objects, use {@link #toJson(Object)} instead. If you want to write out * the object to a {@link Appendable}, use {@link #toJson(Object, Type, Appendable)} instead. * * @param src the object for which JSON representation is to be created * @param typeOfSrc The specific genericized type of src. You can obtain * this type by using the {@link com.google.gson.reflect.TypeToken} class. For example, * to get the type for {@code Collection<Foo>}, you should use: * <pre> * Type typeOfSrc = new TypeToken<Collection<Foo>>(){}.getType(); * </pre> * @return Json representation of {@code src} */
最后看一下我们最常见到的json数据格式 包括jsonObject 和 jsonArray
{ "type": 1, "users": [ { "age": 18, "name": "jack", "address": "china", "phoneNum": "13120457560" }, { "age": 18, "name": "jack", "address": "china", "phoneNum": "13120457560" } ] }
我们直接看一下Gson的解析方法
Gson gson = new Gson(); TasKEntity entity = gson.fromJson(json,TaskEntity.class); //同时我们定义了一个TaskEntity.java public class TasKEntity { List<UserEntity> users; int type; public List<UserEntity> getEntitys() { return users; } public void setEntitys(List<UserEntity> entitys) { this.users = entitys; } public int getType() { return type; } public void setType(int type) { this.type = type; } }
Json数据封装
Gson将数据转化成json格式更为简单,大家可以自行研究一下,现在举两个例子。
public String gsonToString(List<UserEntity> users){ return new Gson().toJson(users); } public String gsonMulitiToString(){ TasKEntity entity=new TasKEntity(); entity.type=1; entity.users=generateUsers(3);//generateUsers是我自己写的一个生成userlist的函数,请自行 return new Gson().toJson(entity); }