背景
SpringMVC框架,添加了一个AOP切面,用来拦截部分请求的返回数据,在返回之前加入一些新增数据。期间为了方便,使用了net.sf.json.JSONObject包,对返回对象进行了Object --> net.sf.json.JSONObject,然后动态添加了一些json属性方便前端使用。但是我在返回对象中增加了一个List<net.sf.json.JSONObjec> 类型额外属性 extra,想保存这个JSONObject。结果了每次都会报getoutputstream() has already been called for this response,栈顶是JSONObject的错误。
原因
由于net.sf.json.JSONObject类并没有实现序列化接口,导致返回对象在走序列化的时候会失败。
解决
使用com.alibaba.fastjson下的JSONObject或其它实现了序列化接口的json库代替即可
部分com.alibaba.fastjson API
// object --> jsonStr --> JSONObject
JSONObject jsonObject = JSON.parseObject(JSON.toJSONString(obj));
// add extract attribute
jsonObject.put("key", "value");
// 将对象序列化成json字符串
String com.alibaba.fastjson.JSON.toJSONString(Object object)
// 将json字符串反序列化成对象
<T> Project com.alibaba.fastjson.JSON.parseObject(String text, Class<T> clazz)
// 将json字符串反序列化成JSON对象
JSONObject com.alibaba.fastjson.JSON.parseObject(String text)
// 根据key 得到json中的json数组
JSONArray com.alibaba.fastjson.JSONObject.getJSONArray(String key)
// 根据下标拿到json数组的json对象
JSONObject com.alibaba.fastjson.JSONArray.getJSONObject(int index)
// 根据key拿到json的字符串值
String com.alibaba.fastjson.JSONObject.getString(String key)
// 根据key拿到json的int值
int com.alibaba.fastjson.JSONObject.getIntValue(String key)
// 根据key拿到json的boolean值
boolean com.alibaba.fastjson.JSONObject.getBooleanValue(String key)
本文探讨了在SpringMVC中使用AOP拦截返回数据时,遇到的序列化JSONObject问题。由于JSONObject未实现序列化,导致返回失败。通过引入com.alibaba.fastjson.JSONObject并演示其API,解决了这个问题。
762

被折叠的 条评论
为什么被折叠?



