HttpServletResponse 返回的json数据不是json字符串,而是json对象
今天在改一个bug
情况:
在spring boot中写了一个类Result ,用来统一封装 各个API响应结果 , 其中重写了toString()方法来返回 json字符串 。
在正常情况下,从其它API 返回给前端的结果都是json字符串,前端可以正确解析
但遇到一些异常的情况,返回给前端的结果却是json对象数据,key少了双引号,前端无法正确解析
从一开始调试到后面网上查找各种资料,想过有可能是注解、方法重写、调用等方面出错,但都难以找到根源
直到后面看到一篇文章说到write() 方法对结果的处理问题,才有所悟,并调试确定了根源
其他能够正确返回json 字符串的,是因为 RestController 注解自动将对象转成了json字符串
而 response.getWriter().write() 是直接将json对象写进去,并没有自动转换成json字符串格式
private void responseResult(HttpServletResponse response, Result<?> result) {
response.setCharacterEncoding("UTF-8");
response.setHeader("Content-Type", "application/json");
response.setHeader("Access-Control-Allow-Credentials", "true");
response.setHeader("Access-Control-Allow-Methods", "GET, POST");
response.setHeader("Access-Control-Allow-Origin", "*");
response.setHeader("Access-Control-Max-Age", "3600");
// response.setHeader("Content-type", "application/json;charset=UTF-8");
response.setStatus(HttpServletResponse.SC_OK);
response.setContentType("application/json;charset=UTF-8");
// ServletOutputStream out = null;
PrintWriter writer=null;
try {
// JSON.toJSONString(result)要获取完整的json字符串,每一个字段都要有set和get方法,不然会缺少某个字段
// response.getWriter().write(JSON.toJSONString(result));
writer=response.getWriter();
// writer.write(result.toString());
writer.write(JSON.toJSONString(result));
writer.flush();
} catch (IOException ex) {
logger.error(ex.getMessage());
}finally {
if(writer!=null) {
writer.close();
}
}
}
而至于重写的toString()方法为什么没有直接返回json字符串
@Override
public String toString() {
Map<String, Object> resultMap=new ConcurrentHashMap<String, Object>();
resultMap.put("code", code);
resultMap.put("result", result);
resultMap.put("msg", msg);
if(data!=null) {
resultMap.put("data", data);
}else {
resultMap.put("data", "");
}
return JSON.toJSONString(resultMap, SerializerFeature.WRITE_MAP_NULL_FEATURES);
}
现在终于找到问题了
resultMap:{result=false, msg=访问token无效, code=401, data=}
JSON.toJSONString(resultMap):{"result":false,"msg":"访问token无效","code":401,"data":""}
JSON.toJSONString(resultMap, SerializerFeature.WRITE_MAP_NULL_FEATURES):{result:false,msg:"访问token无效",code:401,data:""}
可以看到 JSON.toJSONString(resultMap, SerializerFeature.WRITE_MAP_NULL_FEATURES) 返回的字符串中,key 是没有双引号的
这个算是 com.alibaba.fastjson 的一个坑吧
参考:
Spring的ResponseBody和RestController注解返回的json数据不是json字符串,而是json对象... https://blog.csdn.net/weixin_33890526/article/details/87167889
Object与json字符串的相互转换 https://blog.csdn.net/justry_deng/article/details/80780175
fastjson:SerializerFeature属性使用 https://blog.csdn.net/zxl2016/article/details/80987414
共同学习,共同进步,若有补充,欢迎指出,谢谢!
HttpServletResponse 返回的json数据不是json字符串,而是json对象的更多相关文章
- 通过js获取前台数据向一般处理程序传递Json数据,并解析Json数据,将前台传来的Json数据写入数据库表中
摘自:http://blog.csdn.net/mazhaojuan/article/details/8592015 通过js获取前台数据向一般处理程序传递Json数据,并解析Json数据,将前台传来 ...
- Spring Boot返回json数据及完美使用FastJson解析Json数据
Spring Boot返回json数据 视频地址:http://www.iqiyi.com/w_19rubxzsr5.html 博文参考:https://blog.csdn.net/linxingl ...
- 《项目经验》--通过js获取前台数据向一般处理程序传递Json数据,并解析Json数据,将前台传来的Json数据写入数据库表中
先看一下我要实现的功能界面: 这个界面的功能在图中已有展现,课程分配(教师教授哪门课程)在之前的页面中已做好.这个页面主要实现的是授课,即给老师教授的课程分配学生.此页面实现功能的步骤已在页面 ...
- 用jquery解析JSON数据的方法以及字符串转换成json的3种方法
用jquery解析JSON数据的方法,作为jquery异步请求的传输对象,jquery请求后返回的结果是 json对象,这里考虑的都是服务器返回JSON形式的字符串的形式,对于利用JSONObject ...
- ajax传递json数据,springmvc后台就收json数据
1.ajax数据的封装 var json = {"token":token};//封装json数据 $.ajax({ url:'', data:JSON.stringify(jso ...
- 带双反斜杠的Json数据至单反斜杠的Json数据处理
假如你光看标题,你只能哦呵呵了!我也看不懂.还是先描述下问题吧.这里是使用微信接口返回了一些数据.因为该串数据包含html标签所以TX是对该串数据进行了编码的.所有的数据是通过Unicode编码的,然 ...
- Java创建和解析Json数据方法(二)——org.json包的使用
(二)org.json包的使用 1.简介 工具包org.json.jar,是一个轻量级的,JAVA下的json构造和解析工具包,它还包含JSON与XML, HTTP headers, Cookie ...
- 保存json数据到本地和读取本地json数据
private void saveJson(JsonBean bean) { File file = new File(getFilesDir(), "json.txt"); Bu ...
- 在SqlServer 中解析JSON数据 [parseJSON] 函数 数据库中 解析JSON
使用如下: SELECT * FROM parseJSON('{ "联系人": { "姓名": "huang", "网名" ...
- python 如何将JSON数据原封不动的转为字符串(顺序不能变动)?
最好是采用 OrderedDict + json.dumps方案 1. 在存储 content 的时候就使用 OrderedDict 而非用默认的 dict from collections impo ...
随机推荐
- PowerDesigner通过SQL语句生成PDM文件并将name和comment进行互相转换
本篇文章主要介绍了PowerDesigner通过SQL语句生成PDM文件并将name和comment进行互相转换 超详细过程(图文),具有一定的参考价值,感兴趣的小伙伴们可以参考一下 1.软件准备 软 ...
- python之函数对象、名称空间、嵌套、作用域、闭包
函数对象 # 函数名就是存放了函数的内存地址,存放了内存地址的变量都是对象,即 函数名 就是 函数对象# 函数对应的原因# 1 可以直接被引用# 2 可以当作函数参数传递# 3 可以作为函数的返回值 ...
- shell sed 替代1
sed -e '/-DLUA_USE_LINUX/s/-lreadline/-lreadline -lncurses/g' Makefile > tmp mv tmp Makefile 全局换- ...
- [bzoj1135][Ceoi2011]Match_线段树
[Ceoi2011]Match 题目大意:初始时滑冰俱乐部有1到n号的溜冰鞋各k双.已知x号脚的人可以穿x到x+d的溜冰鞋. 有m次操作,每次包含两个数ri,xi代表来了xi个ri号脚的人.xi为负, ...
- 【转帖】.NET的一点历史故事:Novell的崩溃和Xamarin的重生
.NET的一点历史故事:Novell的崩溃和Xamarin的重生 https://blog.csdn.net/sD7O95O/article/details/78096502 学习安装 mono 时了 ...
- Python +requests 关于post请求返回报错
python+request 发送post请求:msg返回"Content type 'application/octet-stream' not supported" 一.问题源 ...
- Number of Containers ZOJ - 3175(数论题)
Problem Description For two integers m and k, k is said to be a container of m if k is divisible by ...
- PATB1040/A1093 有几个PAT
题目描述 The string APPAPT contains two PAT's as substrings. The first one is formed by the 2nd, the 4th ...
- CW2A与CA2W
字符串的ASCII和UNICODE之间的转换 1)Win32提供了API函数MultiByteToWideChar和WideCharToMultiByte来提供这种功能. 2)ATL还提供了另一套转换 ...
- Scala学习十——特质
一.本章要点 类可以实现任意数量的特质 特质可以要求实现它们的类具备特定的字段,方法或超类 和Java接口不同,Scala特质可以提供方法和字段实现 当你将多个特质叠加在一起时,顺序很重要——其方法先 ...