使用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还是数组都能自适应了

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值