通过使用Gson可以方便将json串自动映射为bean对象,方便快捷,但是平台数据可能会出现同字段不同类型时,bean该如何自适应,这里我的解决方法是使用JsonDeserializer手动解析。
直接上实例:
修改前的bean:
private String price;
修改前的json中price可能是string,也可能是arraylist。
修改后:
删除private String price,然后增加private String strPrice和 private ArrayList<PriceItem> priceItems
public class ResultItemBeanDeserilizer implements JsonDeserializer<ResultItemBean> { @Override public ResultItemBean deserialize(JsonElement json, Type typeOfT, JsonDeserializationContext context) throws JsonParseException { ResultItemBean itemBean = new Gson().fromJson(json, ResultItemBean.class); JsonObject jsonObject = json.getAsJsonObject(); if (jsonObject.has("data")) { JsonElement elem = jsonObject.get("data"); if (elem != null && !elem.isJsonNull()) { String valuesString = ""; if (elem.isJsonArray()) { valuesString = elem.getAsJsonArray().toString(); if (!TextUtils.isEmpty(valuesString)){; ArrayList<PriceItem> values = new Gson().fromJson(valuesString, new TypeToken<ArrayList<PriceItem>>() {}.getType()); itemBean.setPriceItems(values); } } else if (elem.isJsonPrimitive()) { Log.d(TAG, "is json Primitive"); valuesString = elem.getAsJsonPrimitive().getAsString(); if (!TextUtils.isEmpty(valuesString)){ itemBean.setStrPrice(valuesString); } } } } return itemBean ; }
以上准备好后,在Gson初始化的时候改为:
Gson gson = new GsonBuilder() .registerTypeAdapter(ResultItemBean.class, new ResultItemBeanDeserilizer()) .create();
大功告成,以后不管平台price是string还是数组都能自适应了