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