com.alibaba.fastjson.JSONArray cannot be cast to com.alibaba.fastjson.JSONObject


 

原来项目中使用的是jackson进行序列化,使用resttempldate调用后端服务(返回值用一个通用对象进行包装,代码在最后),代码如下:

public List<Object> userInfo() {


        Map<String, String> data = new HashMap<>();
        data.put("id", super.getPara("id").trim());
        String url = "/***";
        ResponseData responseData = RestKit.getRestTemplate().postForObject(url, data, ResponseData.class);
        //List<Object> list = (List<Object>) responseData.getData();
        ArrayList<Object> list = (ArrayList<Object>) responseData.getData();
        LogObjectHolder.me().set(list.get(0));
        return list;
    }

但是需要将jackson转换器由fastjson替代时,此时调用却报com.alibaba.fastjson.JSONArray cannot be cast to com.alibaba.fastjson.JSONObject异常,原因是fastjson在使用resttemplate调用后返回的是jsonarray对象,虽然该对象也实现list接口,但是却无法转换成arraylist,所以上面代码不能直接定死ArrayList对象,而是用List

List<Object> list = (List<Object>) responseData.getData();

返回值统一包装对象代码如下:

public class ResponseData<T> implements Serializable {

    public static final String DEFAULT_SUCCESS_MESSAGE = "请求成功";

    public static final String DEFAULT_ERROR_MESSAGE = "网络异常";

    public static final Integer DEFAULT_SUCCESS_CODE = 200;

    public static final Integer DEFAULT_ERROR_CODE = 500;

    /**
     * 请求是否成功
     */
    private Boolean success;

    /**
     * 响应状态码
     */
    private Integer code;

    /**
     * 响应信息
     */
    private String message;

    /**
     * 响应对象
     */
    private T data;

    public ResponseData() {
    }

    public ResponseData(Boolean success, Integer code, String message, T data) {
        this.success = success;
        this.code = code;
        this.message = message;
        this.data = data;
    }
    

    public T getData() {
        return data;
    }

    public void setData(T data) {
        this.data = data;
    }
    

    public Boolean getSuccess() {
        return success;
    }

    public void setSuccess(Boolean success) {
        this.success = success;
    }

    public Integer getCode() {
        return code;
    }

    public void setCode(Integer code) {
        this.code = code;
    }

    public String getMessage() {
        return message;
    }

    public void setMessage(String message) {
        this.message = message;
    }

    public static SuccessResponseData success() {
        return new SuccessResponseData();
    }

    public static SuccessResponseData success(Object object) {
        return new SuccessResponseData(object);
    }

    public static SuccessResponseData success(Integer code, String message, Object object) {
        return new SuccessResponseData(code, message, object);
    }

    public static ErrorResponseData error(String message) {
        return new ErrorResponseData(message);
    }

    public static ErrorResponseData error(Integer code, String message) {
        return new ErrorResponseData(code, message);
    }

    public static ErrorResponseData error(Integer code, String message, Object object) {
        return new ErrorResponseData(code, message, object);
    }
}

另外,关于alibaba 的fastjson,还有个问题需要注意:

com.alibaba.fastjson.JSONArray cannot be cast to com.alibaba.fastjson.JSONObject
json中类型转换问题,[{}]是错误的格式。如下面我的写法:

JSONObject.parseObject("[{\"type\":\"slider\",\"show\":\"true\",\"start\":1,\"end\":100}]");

正确的写法为:

JSONObject[] dataZoom = new JSONObject[]{JSONObject.parseObject("{\"type\":\"slider\",\"show\":\"true\",\"start\":1,\"end\":100}")};

参考文章:

https://blog.csdn.net/qq_33101355/article/details/80112179

 


免责声明!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系本站邮箱yoyou2525@163.com删除。



 
粤ICP备18138465号  © 2018-2025 CODEPRJ.COM