原來項目中使用的是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