使用JsonDeserializer自適應平臺同字段不同類型數據

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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章