您的位置:首页 > Web前端 > JavaScript

使用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
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: