Android:使用Gson结合泛型类灵活解析JSON数据
发布时间:2016/1/15 来源:搜数网络 浏览:59

一般比较规范的后端JSON返回数据,会遵循一些指定的JSON格式,比如:

错误:

[javascript] view plaincopy在CODE上查看代码片派生到我的代码片
  1. {  
  2.     "status": -1,  
  3.     "data"null,  
  4.     "err""not_found"  
  5. }  
正确:
[javascript] view plaincopy在CODE上查看代码片派生到我的代码片
  1. {  
  2.     "status": 0,  
  3.     "data": {  
  4.         "price": 4,  
  5.         "name""脉动",  
  6.         "type""饮料",  
  7.         "amount": 50,  
  8.         "summary""随时随地,脉动回来",  
  9.         "picture""http://www.jpjy365.com/images/201402/source_img/29726_G_1393285888119.jpg",  
  10.         "hot"true,  
  11.         "sales": 100  
  12.     },  
  13.     "err"null  
  14. }  
那么我们可以定义一个通用数据类,比如叫做:UniApiResult
[java] view plaincopy在CODE上查看代码片派生到我的代码片
  1. public class UniApiResult {  
  2.   
  3.     @SerializedName("status")  
  4.     private int mStatus;      
  5.   
  6.     @SerializedName("err")  
  7.     private String mErr;  
  8.   
  9.     @SerializedName("data")  
  10.     private T mData;  
  11.   
  12.     public int getStatus() {  
  13.         return mStatus;  
  14.     }  
  15.   
  16.     public void setStatus(int status) {  
  17.         mStatus = status;  
  18.     }  
  19.   
  20.     public String getErr() {  
  21.         return mErr;  
  22.     }  
  23.   
  24.     public void setErr(String err) {  
  25.         mErr = err;  
  26.     }  
  27.   
  28.     public T getData() {  
  29.         return mData;  
  30.     }  
  31.   
  32.     public void setData(T data) {  
  33.         mData = data;  
  34.     }  
  35. }  
然后,我们在需要解析数据特定的数据时,只需要根据特定的数据类型定义一个Model就可以了,如:
[java] view plaincopy在CODE上查看代码片派生到我的代码片
  1. public class GoodsInfoModel {      
  2.       
  3.     @SerializedName("price")  
  4.     private int mPrice;  
  5.       
  6.     @SerializedName("name")  
  7.     private String mName;  
  8.       
  9.     @SerializedName("type")  
  10.     private String mType;  
  11.       
  12.     @SerializedName("amount")  
  13.     private int mAmount;  
  14.       
  15.     @SerializedName("summary")  
  16.     private String mSummary;  
  17.       
  18.     @SerializedName("picture")  
  19.     private String mPicture;  
  20.       
  21.     @SerializedName("hot")  
  22.     private boolean mHot;  
  23.       
  24.     @SerializedName("sales")  
  25.     private int mSales;  
  26.       
  27.     public int getPrice() {  
  28.         return mPrice;  
  29.     }  
  30.   
  31.     public void setPrice(int price) {  
  32.         mPrice = price;  
  33.     }  
  34.   
  35.     public String getName() {  
  36.         return mName;  
  37.     }  
  38.   
  39.     public void setName(String name) {  
  40.         mName = name;  
  41.     }  
  42.   
  43.     public String getType() {  
  44.         return mType;  
  45.     }  
  46.   
  47.     public void setType(String type) {  
  48.         mType = type;  
  49.     }  
  50.   
  51.     public int getAmount() {  
  52.         return mAmount;  
  53.     }  
  54.   
  55.     public void setAmount(int amount) {  
  56.         mAmount = amount;  
  57.     }  
  58.   
  59.     public String getSummary() {  
  60.         return mSummary;  
  61.     }  
  62.   
  63.     public void setSummary(String summary) {  
  64.         mSummary = summary;  
  65.     }  
  66.   
  67.     public String getPicture() {  
  68.         return mPicture;  
  69.     }  
  70.   
  71.     public void setPicture(String picture) {  
  72.         mPicture = picture;  
  73.     }  
  74.   
  75.     public boolean getHot() {  
  76.         return mHot;  
  77.     }  
  78.   
  79.     public void setHot(boolean hot) {  
  80.         mHot = hot;  
  81.     }  
  82.   
  83.     public int getSales() {  
  84.         return mSales;  
  85.     }  
  86.   
  87.     public void setSales(int sales) {  
  88.         mSales = sales;  
  89.     }  
  90.   
  91. }  
那么,我们在解析数据的时候,用如下方法即可:
[java] view plaincopy在CODE上查看代码片派生到我的代码片
  1. /** 
  2.  * 数据解析 
  3.  * 
  4.  * @param jsonStr JSON字符串 
  5.  * @return UniApiResult 数据对象 
  6.  */  
  7. public UniApiResult parseJson(String jsonStr) {  
  8.     Gson gson = new Gson();  
  9.     Type jsonType = new TypeToken
  10.     }.getType();  
  11.     return gson.fromJson(jsonStr, jsonType);  
  12. }  
值得注意的是,TypeToken的用法,TypeToken是Gson库中包含的一种获取JSON类型的类,可以传入泛型来获取类型,而getType或getClass这种方法是获取不到泛型类型的,所以Gson解析泛型类型数据的关键就是TypeToken,这个方法解析完成后,即可返回UniApiResult类型的对象,通过getData()方法,就可以获取到GoodsInfoModel类型的对象数据了,是不是很省事了呢?


原文:http://blog.csdn.net/yuanguozhengjust/article/details/50477128

 

 

返回