原来项目中使用的是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