今天在改一个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对象的更多相关文章

  1. 通过js获取前台数据向一般处理程序传递Json数据,并解析Json数据,将前台传来的Json数据写入数据库表中

    摘自:http://blog.csdn.net/mazhaojuan/article/details/8592015 通过js获取前台数据向一般处理程序传递Json数据,并解析Json数据,将前台传来 ...

  2. Spring Boot返回json数据及完美使用FastJson解析Json数据

     Spring Boot返回json数据 视频地址:http://www.iqiyi.com/w_19rubxzsr5.html 博文参考:https://blog.csdn.net/linxingl ...

  3. 《项目经验》--通过js获取前台数据向一般处理程序传递Json数据,并解析Json数据,将前台传来的Json数据写入数据库表中

      先看一下我要实现的功能界面:   这个界面的功能在图中已有展现,课程分配(教师教授哪门课程)在之前的页面中已做好.这个页面主要实现的是授课,即给老师教授的课程分配学生.此页面实现功能的步骤已在页面 ...

  4. 用jquery解析JSON数据的方法以及字符串转换成json的3种方法

    用jquery解析JSON数据的方法,作为jquery异步请求的传输对象,jquery请求后返回的结果是 json对象,这里考虑的都是服务器返回JSON形式的字符串的形式,对于利用JSONObject ...

  5. ajax传递json数据,springmvc后台就收json数据

    1.ajax数据的封装 var json = {"token":token};//封装json数据 $.ajax({ url:'', data:JSON.stringify(jso ...

  6. 带双反斜杠的Json数据至单反斜杠的Json数据处理

    假如你光看标题,你只能哦呵呵了!我也看不懂.还是先描述下问题吧.这里是使用微信接口返回了一些数据.因为该串数据包含html标签所以TX是对该串数据进行了编码的.所有的数据是通过Unicode编码的,然 ...

  7. Java创建和解析Json数据方法(二)——org.json包的使用

    (二)org.json包的使用 1.简介   工具包org.json.jar,是一个轻量级的,JAVA下的json构造和解析工具包,它还包含JSON与XML, HTTP headers, Cookie ...

  8. 保存json数据到本地和读取本地json数据

    private void saveJson(JsonBean bean) { File file = new File(getFilesDir(), "json.txt"); Bu ...

  9. 在SqlServer 中解析JSON数据 [parseJSON] 函数 数据库中 解析JSON

    使用如下: SELECT * FROM parseJSON('{ "联系人": { "姓名": "huang", "网名" ...

  10. python 如何将JSON数据原封不动的转为字符串(顺序不能变动)?

    最好是采用 OrderedDict + json.dumps方案 1. 在存储 content 的时候就使用 OrderedDict 而非用默认的 dict from collections impo ...

随机推荐

  1. python 之魔法方法

    描述符就是将某种特殊类型的类的实例指派给另一个类的属性 例如下面的示例 class MyDecriptor(): def get(self,instance,owner): print("g ...

  2. Oracle通过正则表达式分割字符串 REGEXP_SUBSTR

    REGEXP_SUBSTR函数格式如下: function REGEXP_SUBSTR(string, pattern, position, occurrence, modifier) string ...

  3. JVM 分析工具和查看命令,超详细

    jinfo 可以输出并修改运行时的java 进程的opts. jps 与unix上的ps类似,用来显示本地的java进程,可以查看本地运行着几个java程序,并显示他们的进程号. jstat 一个极强 ...

  4. PHPRedis教程之geo

    前言 支持 GEO 系列命令的 Redis 版本从 3.2.0 起开始才可以使用,所以之前版本就不要想了. 函数列表 geoadd - 将指定的地理空间项(纬度,经度,名称)添加到指定的键, 数据作为 ...

  5. 一个非常好用的php后台模板

    http://www.h-ui.net/H-ui.admin.shtml

  6. Python特色数据类型--元组

    元组是不可改变的,创建后就不能做任何修改操作了 1.元组用()表示

  7. Gson格式转换Integer变为Double类型问题解决

    问题描述 在前后端分离的开发模式下,前后端交互通常采用JSON格式数据.自然会涉及到json字符串与JAVA对象之间的转换.实现json字符串与Java对象相互转换的工具很多,常用的有Json.Gso ...

  8. nginx-consul-template

    概述Consul-template 是 HashiCorp 基于 Consul 所提供的可扩展的工具,通过监听 Consul中的数据变化,动态地修改一些配置文件中地模板.常用于在 Nginx.HAPr ...

  9. Elastic Search快速上手(1):简介及安装配置

    前言 最近开始尝试学习Elastic Search,因此决定做一些简单的整理,以供后续参考,快速上手使用ES. 简介 ElasticSearch是一个基于Lucene的搜索服务器.它提供了一个分布式多 ...

  10. windows server 2008 R2 Enterprise 防火墙开启允许远程桌面登录

    解决方法: 开始------ > 运行 ----- > gpedit.msc 打开“本地组策略编辑器”,按如下设置:计算机配置----->管理模板----->网络-----&g ...