«

初识GSON

时间:2024-3-2 17:42     作者:韩俊     分类: Android


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&lt;Collection&lt;Foo&gt;&gt;(){}.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);
}

标签: android

热门推荐