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 ...
随机推荐
- python 之魔法方法
描述符就是将某种特殊类型的类的实例指派给另一个类的属性 例如下面的示例 class MyDecriptor(): def get(self,instance,owner): print("g ...
- Oracle通过正则表达式分割字符串 REGEXP_SUBSTR
REGEXP_SUBSTR函数格式如下: function REGEXP_SUBSTR(string, pattern, position, occurrence, modifier) string ...
- JVM 分析工具和查看命令,超详细
jinfo 可以输出并修改运行时的java 进程的opts. jps 与unix上的ps类似,用来显示本地的java进程,可以查看本地运行着几个java程序,并显示他们的进程号. jstat 一个极强 ...
- PHPRedis教程之geo
前言 支持 GEO 系列命令的 Redis 版本从 3.2.0 起开始才可以使用,所以之前版本就不要想了. 函数列表 geoadd - 将指定的地理空间项(纬度,经度,名称)添加到指定的键, 数据作为 ...
- 一个非常好用的php后台模板
http://www.h-ui.net/H-ui.admin.shtml
- Python特色数据类型--元组
元组是不可改变的,创建后就不能做任何修改操作了 1.元组用()表示
- Gson格式转换Integer变为Double类型问题解决
问题描述 在前后端分离的开发模式下,前后端交互通常采用JSON格式数据.自然会涉及到json字符串与JAVA对象之间的转换.实现json字符串与Java对象相互转换的工具很多,常用的有Json.Gso ...
- nginx-consul-template
概述Consul-template 是 HashiCorp 基于 Consul 所提供的可扩展的工具,通过监听 Consul中的数据变化,动态地修改一些配置文件中地模板.常用于在 Nginx.HAPr ...
- Elastic Search快速上手(1):简介及安装配置
前言 最近开始尝试学习Elastic Search,因此决定做一些简单的整理,以供后续参考,快速上手使用ES. 简介 ElasticSearch是一个基于Lucene的搜索服务器.它提供了一个分布式多 ...
- windows server 2008 R2 Enterprise 防火墙开启允许远程桌面登录
解决方法: 开始------ > 运行 ----- > gpedit.msc 打开“本地组策略编辑器”,按如下设置:计算机配置----->管理模板----->网络-----&g ...