通過使用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還是數組都能自適應了