使用GSON和泛型解析约定格式的JSON串(转)
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
使用GSON和泛型解析约定格式的JSON串(转)
{"success":true,"data":##}
success:代表是否访问成功
data:后面跟着所需信息.
基本相同的JSON结构,所以想定义一种通用模型对应到此结构。
但是,data中的数据类型不一致。
如第一种是简单对象,第二种是对象中嵌套数组,第三种是List。
针对data数据类型不一致的情况,使用泛型来解import java.io.Serializable;
import ng.reflect.ParameterizedType;
import ng.reflect.Type;
import com.google.gson.Gson;
public class CommonJson<T> implements Serializable {
/** *
*/
private static final long serialVersionUID = -3440061414071692254L;
/** * 是否成功
*/
private Boolean success;
/** * 数据
*/
private T data;
public Boolean getSuccess() {
return success;
}
public void setSuccess(Boolean success) {
this.success = success;
}
public T getData() {
return data;
}
public void setData(T data) {
this.data = data;
}
}
GSON对于泛型的支持不足,为了使GSON对于泛型进行解析,JSON解析与组装代码如下:
public static CommonJson fromJson(String json, Class clazz) {
Gson gson = new Gson();
Type objectType = type(CommonJson.class, clazz);
return gson.fromJson(json, objectType);
}
public String toJson(Class<T> clazz) {
Gson gson = new Gson();
Type objectType = type(CommonJson.class, clazz);
return gson.toJson(this, objectType);
}
static ParameterizedType type(final Class raw, final Type... args) {
return new ParameterizedType() {
public Type getRawType() {
return raw;
}
public Type[] getActualTypeArguments() {
return args;
}
public Type getOwnerType() {
return null;
}
};
}
以上两段代码可以满足第一种和第二种JSON的解析,对于第三种,data是List类型的,无法得到List<>的class,所以,针对第三种格式,实现代码如下:
import java.io.Serializable;
import ng.reflect.ParameterizedType;
import ng.reflect.Type;
import java.util.List;
import com.google.gson.Gson;
public class CommonJson4List<T> implements Serializable {
/** *
*/
private static final long serialVersionUID = -369558847578246550L;
/** * 是否成功
*/
private Boolean success;
/** * 数据
*/
private List<T> data;
public Boolean getSuccess() {
return success;
}
public void setSuccess(Boolean success) {
this.success = success;
}
public List<T> getData() {
return data;
}
public void setData(List<T> data) {
this.data = data;
}
public static CommonJson4List fromJson(String json, Class clazz) {
Gson gson = new Gson();
Type objectType = type(CommonJson4List.class, clazz);
return gson.fromJson(json, objectType);
}
public String toJson(Class<T> clazz) {
做出评价,
}
}
执行结果如下:
{"success":true,"data":{"averageStarLevel":4.7,"remarkCount":10}}
true
4.7
{"success":true,"data":{"page":10,"pageCount":29,"list":[{"starLevel":4,"remarkCotnent":"评价方未及时做出评价,系统默认满意!","remarkTime":"2013-02-27 07:21:48","explainContent":"","postMemberId" 59
29
b**6
{"success":true,"data":[{"starLevel":4,"remarkCotnent":"评价方未及时做出评价,系统默认满意!","remarkTime":"2013-02-27 07:21:48","explainContent":"","postMemberId":"y**f","tpLogoURL":"http://i04.c y**f
Ps:文中说到Gson对泛型的支持不足,其实是不正确的,Gson对泛型做了以下支持:
public static CommonJson4List fromJson(String json, Class clazz) {
Gson gson = new Gson();
Type objectType = new TypeToken<CommonJson4List<clazz>>() {}.getType();
return gson.fromJson(json, objectType);
}
只需将获取类型的泛型类作为TypeToken的泛型参数构造一个匿名的子类,就可以通过getType方法获取一个parameterized类型,结果与type方法一致。