使用Gson结合泛型类灵活解析JSON数据
来源:互联网 发布:cmd ssh 连接 linux 编辑:程序博客网 时间:2024/06/05 15:52
一般比较规范的后端JSON返回数据,会遵循一些指定的JSON格式,比如:
错误:
- {
- "status": -1,
- "data": null,
- "err": "not_found"
- }
正确:- {
- "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- 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就可以了,如:- 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;
- }
-
- }
那么,我们在解析数据的时候,用如下方法即可:-
-
-
-
-
-
- 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
0 0