https://blog.csdn.net/u011082160/article/details/92424436

案例一:

以我实际开发遇到的问题举例:

public class BaseResponseBean {
    public String code;
    public String msg;

    //由于不同的情况返回的类型不一样,所以只能用Object接收
    public Object result;

    @Override
    public String toString() {
        return "BaseReadCarStateResponseBean{" +
                "code='" + code + '\'' +
                ", msg='" + msg + '\'' +
                ", result=" + result +
                '}';
    }
}

对于result字段,某种类型的失败会返回一个String类型的错误描述字符串,正常解析可能是RemoteControlContent类型。如果我将BaseResponseBean中的result定义成RemoteControlContent类型,如果发生错误就会造成类型转换错误。

所以我又定义了一个BaseRemoteControlResponseBean类:

public class BaseRemoteControlResponseBean{
    public String code;
    public String msg;
    public RemoteControlContent result;

    @Override
    public String toString() {
        return "BaseRemoteControlResponseBean{" +
                "code='" + code + '\'' +
                ", msg='" + msg + '\'' +
                ", result=" + result +
                '}';
    }
}

然后解析json的时候,用google自带的Json解析类JsonObject判断一下result字段的类型,对于不同类型的result,则解析成不同的实体。

JsonParser parser = new JsonParser();
                            JsonElement element = parser.parse(json);
                            if (element.isJsonObject()) {//假设最外层是object
                                // 把JsonElement对象转换成JsonObject
                                JsonObject JsonObject = element.getAsJsonObject();
                                JsonElement jsonElement = JsonObject.get("result");
                                if (jsonElement == null || jsonElement.isJsonNull() || jsonElement.isJsonPrimitive()) {
                                    BaseResponseBean baseResponseBean = GsonUtil.gson.fromJson(json, BaseResponseBean.class);
                                    httpResultHandler.onFailure(requestPageFlag,requestCode,baseResponseBean.code,baseResponseBean.msg + "&" + baseResponseBean.result);
                                } else if (jsonElement.isJsonObject()) {
                                    BaseRemoteControlResponseBean baseHttpResultBean = GsonUtil.gson.fromJson(json, BaseRemoteControlResponseBean.class);
                                    httpResultHandler.onSuccess(requestPageFlag,requestCode,  baseHttpResultBean);
                                }
                            }

案例二:

有这样一串json:

{"content":"","msgType":"运营消息推送(纯文本)","msgTypeCode":"M004","popType":0,"title":"运营消息推送(纯文本)","userDef":{"content":"不思量,自难相忘"}}

不同的msgType对应着不同的userDef结构,这时就需要将msgTypeCode、userDef单独取出来再解析。

String tspMessage = new String(gtTransmitMessage.getPayload());
        LogUtils.d(TAG, "tspMessage:" + tspMessage);
        JsonElement jsonElement = JsonParser.parseString(tspMessage);
        JsonObject asJsonObject = jsonElement.getAsJsonObject();
        JsonElement msgTypeCodeJE = asJsonObject.get("msgTypeCode");
        if (null == msgTypeCodeJE) {
            LogUtils.e(TAG, "不认识的消息:" + tspMessage);
            return;
        }
        String msgTypeCode = msgTypeCodeJE.toString();

定义结构的时候可以将userDef定义成泛型,然后不同的msgTypeCode创建解析成不同的实现类即可。

分类: Gson

0 条评论

发表回复

您的电子邮箱地址不会被公开。