今天在改一个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. Android MVC MVP MVVM (一)

    示例效果 一共三个控件,EditText,Button,TextView 成功显示账号信息,查询失败显示错误信息. <?xml version="1.0" encoding= ...

  2. airflow原理

    官网: http://airflow.apache.org/installation.html 原理: https://www.cnblogs.com/cord/p/9450910.html 原理介绍 ...

  3. python 下安装pymysql数据库

    两种方法来安装pymysql 方法一.利用命令来安装 安装:python37 -m pip install pymysql 升级:python37 -m pip install pymysql --u ...

  4. 小菜鸟之HTML常用

    html的基本结构是什么? 表示段落标签是什么?<p> 表示标题标签的是什么?<title>Css标签样式</title> 表示区域标签的是什么?<div&g ...

  5. 基于Opencv快速实现人脸识别(完整版)

    无耻收藏网页链接: 基于OpenCV快速实现人脸识别:https://blog.csdn.net/beyond9305/article/details/92844258 基于Opencv快速实现人脸识 ...

  6. Codeforces Round #333 (Div. 2) B. Approximating a Constant Range

    B. Approximating a Constant Range Time Limit: 20 Sec Memory Limit: 256 MB 题目连接 http://codeforces.com ...

  7. Snoopy.class.php使用手册

    Snoopy - the PHP net client v1.2.4 Snoopy是一个php类,用来模拟浏览器的功能,可以获取网页内容,发送表单.Snoopy的特点:1.抓取网页的内容 fetch2 ...

  8. Iview 中 获取 Menu 导航菜单 选中的值

    期望效果: 原来,我用的是脚本来控制,然后........,再然后,我再去仔细看官方文档的时候,才发现,Menu组件 有那么两个事件,on-select 和 on-open-change ,好气啊,之 ...

  9. 一次简单的springboot+dubbo+flume+kafka+storm+redis系统

    最近无事学习一下,用springboot+dubbo+flume+kafka+storm+redis做了一个简单的scenic系统 scenicweb:展现层,springboot+dubbo sce ...

  10. merge into使用方法

    此外,You cannot update a column that is referenced in the ON condition clause.,update的字段不可以是on里面的条件字段, ...