使用Gson结合泛型类灵活解析JSON数据
2017-06-06 11:50
435 查看
=====我自己遇到的问题
因为这个是一个对象,当为空的时候,就会报对象不能被赋值为字符串类型,,,
解决方法:使用泛型
==================http://blog.csdn.net/yuanguozhengjust/article/details/50477128
一般比较规范的后端JSON返回数据,会遵循一些指定的JSON格式,比如:
错误:
[javascript] view
plain copy
{
"status": -1,
"data": null,
"err": "not_found"
}
正确:
[javascript] view
plain copy
{
"status": 0,
"data": {
"price": 4,
"name": "脉动",
"type": "饮料",
"amount": 50,
"summary": "随时随地,脉动回来",
"picture": "http://www.jpjy365.com/images/201402/source_img/29726_G_1393285888119.jpg",
"hot": true,
"sales": 100
},
"err": null
}
那么我们可以定义一个通用数据类,比如叫做:UniApiResult
[java] view
plain copy
public class UniApiResult<T> {
@SerializedName("status")
private int mStatus;
@SerializedName("err")
private String mErr;
@SerializedName("data")
private T mData;
public int getStatus() {
return mStatus;
}
public void setStatus(int status) {
mStatus = status;
}
public String getErr() {
return mErr;
}
public void setErr(String err) {
mErr = err;
}
public T getData() {
return mData;
}
public void setData(T data) {
mData = data;
}
}
然后,我们在需要解析数据特定的数据时,只需要根据特定的数据类型定义一个Model就可以了,如:
[java] view
plain copy
public class GoodsInfoModel {
@SerializedName("price")
private int mPrice;
@SerializedName("name")
private String mName;
@SerializedName("type")
private String mType;
@SerializedName("amount")
private int mAmount;
@SerializedName("summary")
private String mSummary;
@SerializedName("picture")
private String mPicture;
@SerializedName("hot")
private boolean mHot;
@SerializedName("sales")
private int mSales;
public int getPrice() {
return mPrice;
}
public void setPrice(int price) {
mPrice = price;
}
public String getName() {
return mName;
}
public void setName(String name) {
mName = name;
}
public String getType() {
return mType;
}
public void setType(String type) {
mType = type;
}
public int getAmount() {
return mAmount;
}
public void setAmount(int amount) {
mAmount = amount;
}
public String getSummary() {
return mSummary;
}
public void setSummary(String summary) {
mSummary = summary;
}
public String getPicture() {
return mPicture;
}
public void setPicture(String picture) {
mPicture = picture;
}
public boolean getHot() {
return mHot;
}
public void setHot(boolean hot) {
mHot = hot;
}
public int getSales() {
return mSales;
}
public void setSales(int sales) {
mSales = sales;
}
}
那么,我们在解析数据的时候,用如下方法即可:
[java] view
plain copy
/**
* 数据解析
*
* @param jsonStr JSON字符串
* @return UniApiResult<GoodsInfoModel> 数据对象
*/
public UniApiResult<GoodsInfoModel> parseJson(String jsonStr) {
Gson gson = new Gson();
Type jsonType = new TypeToken<UniApiResult<GoodsInfoModel>>() {
}.getType();
return gson.fromJson(jsonStr, jsonType);
}
值得注意的是,TypeToken的用法,TypeToken是Gson库中包含的一种获取JSON类型的类,可以传入泛型来获取类型,而getType或getClass这种方法是获取不到泛型类型的,所以Gson解析泛型类型数据的关键就是TypeToken,这个方法解析完成后,即可返回UniApiResult<GoodsInfoModel>类型的对象,通过getData()方法,就可以获取到GoodsInfoModel类型的对象数据了,是不是很省事了呢?
转载请注明出处:http://blog.csdn.net/yuanguozhengjust/article/details/50477128
因为这个是一个对象,当为空的时候,就会报对象不能被赋值为字符串类型,,,
解决方法:使用泛型
==================http://blog.csdn.net/yuanguozhengjust/article/details/50477128
一般比较规范的后端JSON返回数据,会遵循一些指定的JSON格式,比如:
错误:
[javascript] view
plain copy
{
"status": -1,
"data": null,
"err": "not_found"
}
正确:
[javascript] view
plain copy
{
"status": 0,
"data": {
"price": 4,
"name": "脉动",
"type": "饮料",
"amount": 50,
"summary": "随时随地,脉动回来",
"picture": "http://www.jpjy365.com/images/201402/source_img/29726_G_1393285888119.jpg",
"hot": true,
"sales": 100
},
"err": null
}
那么我们可以定义一个通用数据类,比如叫做:UniApiResult
[java] view
plain copy
public class UniApiResult<T> {
@SerializedName("status")
private int mStatus;
@SerializedName("err")
private String mErr;
@SerializedName("data")
private T mData;
public int getStatus() {
return mStatus;
}
public void setStatus(int status) {
mStatus = status;
}
public String getErr() {
return mErr;
}
public void setErr(String err) {
mErr = err;
}
public T getData() {
return mData;
}
public void setData(T data) {
mData = data;
}
}
然后,我们在需要解析数据特定的数据时,只需要根据特定的数据类型定义一个Model就可以了,如:
[java] view
plain copy
public class GoodsInfoModel {
@SerializedName("price")
private int mPrice;
@SerializedName("name")
private String mName;
@SerializedName("type")
private String mType;
@SerializedName("amount")
private int mAmount;
@SerializedName("summary")
private String mSummary;
@SerializedName("picture")
private String mPicture;
@SerializedName("hot")
private boolean mHot;
@SerializedName("sales")
private int mSales;
public int getPrice() {
return mPrice;
}
public void setPrice(int price) {
mPrice = price;
}
public String getName() {
return mName;
}
public void setName(String name) {
mName = name;
}
public String getType() {
return mType;
}
public void setType(String type) {
mType = type;
}
public int getAmount() {
return mAmount;
}
public void setAmount(int amount) {
mAmount = amount;
}
public String getSummary() {
return mSummary;
}
public void setSummary(String summary) {
mSummary = summary;
}
public String getPicture() {
return mPicture;
}
public void setPicture(String picture) {
mPicture = picture;
}
public boolean getHot() {
return mHot;
}
public void setHot(boolean hot) {
mHot = hot;
}
public int getSales() {
return mSales;
}
public void setSales(int sales) {
mSales = sales;
}
}
那么,我们在解析数据的时候,用如下方法即可:
[java] view
plain copy
/**
* 数据解析
*
* @param jsonStr JSON字符串
* @return UniApiResult<GoodsInfoModel> 数据对象
*/
public UniApiResult<GoodsInfoModel> parseJson(String jsonStr) {
Gson gson = new Gson();
Type jsonType = new TypeToken<UniApiResult<GoodsInfoModel>>() {
}.getType();
return gson.fromJson(jsonStr, jsonType);
}
值得注意的是,TypeToken的用法,TypeToken是Gson库中包含的一种获取JSON类型的类,可以传入泛型来获取类型,而getType或getClass这种方法是获取不到泛型类型的,所以Gson解析泛型类型数据的关键就是TypeToken,这个方法解析完成后,即可返回UniApiResult<GoodsInfoModel>类型的对象,通过getData()方法,就可以获取到GoodsInfoModel类型的对象数据了,是不是很省事了呢?
转载请注明出处:http://blog.csdn.net/yuanguozhengjust/article/details/50477128
相关文章推荐
- 使用Gson结合泛型类灵活解析JSON数据
- 如何统一解析JSON数据,使用Gson结合泛型类灵活,让您一劳永逸
- 使用Gson结合泛型类灵活解析JSON数据
- 灵活组装Json的数据使用Gson的JsonParser和JsonReader解析Json详解例子
- 灵活组装Json的数据使用Gson的JsonParser和JsonReader解析Json详解例子
- 灵活组装Json的数据使用Gson的JsonParser和JsonReader解析Json详解例子
- 使用Gson和FastJson解析JSON数据遇到的问题
- 使用Gson解析复杂的json数据
- 使用Gson解析复杂的json数据
- 使用gson解析json数据
- 使用Gson解析json数据
- Android之使用GSON解析JSON数据
- Android下使用Gson解析JSON数据
- 使用Gson生成和解析json数据
- 使用Gson解析复杂、变态的Json数据(包含中文key)
- Android中使用Gson解析JSON数据
- android学习---使用GSON解析JSON格式数据
- Android中Gson解析json数据使用@SerializedName注解与java对象不匹配的字段
- 使用Gson解析复杂、变态的Json数据(包含中文key)
- 使用Gson轻松解决复杂结构的Json数据解析