spring mvc踩坑 - jackson解析框架返回json多一层双引号

2024-03-17 23:38

本文主要是介绍spring mvc踩坑 - jackson解析框架返回json多一层双引号,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

问题:

两套业务逻辑代码相同,但返回的数据不同,导致相同的前端代码用eval解析时出错。其中一个多了一层双引号,分别为

"{\"aaa\":1}"  "\"{\"aaa\":1}\""
//服务端代码@RequestMapping(method = RequestMethod.POST, params = "method=xxx")public@ResponseBodyString xxx() {Result r = service.query();String result = JsonUtils.toJson(r);return result;}
//客户端代码
jQuery.post(url, data, function (result1) {if (result1 != "" && result1 != null) {var objs = eval('(' + result1 + ')');var myResult = eval('(' + objs + ')');}})	

解决思路:

  • 比较服务端业务代码:一致,且断点调试return的字符串相同,都是"{\"aaa\":1}"  
  • 比较前端代码:一致,且前端引擎都是velocity
  • 比较http协议:不一致,request头信息一致,但reponse头信息不一致,返回一层双引号的是 Content-Type:application/json;charset=UTF-8,返回两层双引号的是Content-type:text/html;charset=utf-8,于是怀疑有过滤器或拦截器修改了响应头信息
  • 查看过滤器和拦截器:两边一致,并且都没有修改响应头信息
  • 查看spring mvc的配置的json解析工具:都是jackson,但两个配置文件中supportedMediaTypes的顺序不一致,再考虑到响应头的不同,终于找到了问题的答案-Spring选择Converter是有优先级的(1、请求中的ContentType和Accept对应的Converter 2、如果1无法找到对应Converter,则通过遍历MessageConverters的canRead/canWrite选择最有可能的Converter  3、如果2无法找到对应Converter,则返回错误。)
//一层引号springmvc配置的json解析
<bean id="mappingJacksonHttpMessageConverter"class="org.springframework.http.converter.json.MappingJackson2HttpMessageConverter"><property name="supportedMediaTypes"><list><value>application/json;charset=UTF-8</value><value>text/html;charset=UTF-8</value></list></property></bean><mvc:annotation-driven><mvc:message-converters><ref bean="mappingJacksonHttpMessageConverter"/></mvc:message-converters></mvc:annotation-driven>//两层引号springmvc配置的json解析
<bean id="mappingJacksonHttpMessageConverter"class="org.springframework.http.converter.json.MappingJackson2HttpMessageConverter"><property name="supportedMediaTypes"><list><value>text/html;charset=UTF-8</value><value>application/json;charset=UTF-8</value></list></property></bean><bean class="org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter"><property name="messageConverters"><util:list id="beanList"><ref bean="mappingJacksonHttpMessageConverter"/></util:list></property></bean>

解决方案

  1. 修改spring mvc的配置文件,调整消息转换器的顺序
  2. 一层引号的版本,前端去掉一层eval函数
  3. 优化:
  • 服务端的JsonUtils.toJson()是多余的,因为spring mvc配置的json解析工具会自动序列化结果。
  • text/html;charset=UTF-8这种Content-Type会在数据外层包裹上一层双引号,如果返回的是string类型,则会出现两层双引号;返回Object,也会出现一层双引号,需要用eval来去除,或者在jQuery post() 方法指定预期的服务器响应的数据类型为'json';
//服务端代码@RequestMapping(method = RequestMethod.POST, params = "method=xxx")public@ResponseBodyObject xxx() {Result r = service.query();Return r;}//1、客户端代码(如果响应头是application/json;charset=UTF-8)
jQuery.post(url, data, function (result1) {if (result1 != "" && result1 != null) {var myResult = result1;}})	//2、1 客户端代码(如果响应头是text/html;charset=UTF-8)
jQuery.post(url, data, function (result1) {if (result1 != "" && result1 != null) {var myResult = result1;}},'json')	//2、2 客户端代码(如果响应头是text/html;charset=UTF-8)
jQuery.post(url, data, function (result1) {if (result1 != "" && result1 != null) {var myResult = eval('(' + result1+ ')');}})

 

这篇关于spring mvc踩坑 - jackson解析框架返回json多一层双引号的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/820562

相关文章

Java 正则表达式URL 匹配与源码全解析

《Java正则表达式URL匹配与源码全解析》在Web应用开发中,我们经常需要对URL进行格式验证,今天我们结合Java的Pattern和Matcher类,深入理解正则表达式在实际应用中... 目录1.正则表达式分解:2. 添加域名匹配 (2)3. 添加路径和查询参数匹配 (3) 4. 最终优化版本5.设计思

Java使用ANTLR4对Lua脚本语法校验详解

《Java使用ANTLR4对Lua脚本语法校验详解》ANTLR是一个强大的解析器生成器,用于读取、处理、执行或翻译结构化文本或二进制文件,下面就跟随小编一起看看Java如何使用ANTLR4对Lua脚本... 目录什么是ANTLR?第一个例子ANTLR4 的工作流程Lua脚本语法校验准备一个Lua Gramm

Java字符串操作技巧之语法、示例与应用场景分析

《Java字符串操作技巧之语法、示例与应用场景分析》在Java算法题和日常开发中,字符串处理是必备的核心技能,本文全面梳理Java中字符串的常用操作语法,结合代码示例、应用场景和避坑指南,可快速掌握字... 目录引言1. 基础操作1.1 创建字符串1.2 获取长度1.3 访问字符2. 字符串处理2.1 子字

Java Optional的使用技巧与最佳实践

《JavaOptional的使用技巧与最佳实践》在Java中,Optional是用于优雅处理null的容器类,其核心目标是显式提醒开发者处理空值场景,避免NullPointerExce... 目录一、Optional 的核心用途二、使用技巧与最佳实践三、常见误区与反模式四、替代方案与扩展五、总结在 Java

Vue3组件中getCurrentInstance()获取App实例,但是返回null的解决方案

《Vue3组件中getCurrentInstance()获取App实例,但是返回null的解决方案》:本文主要介绍Vue3组件中getCurrentInstance()获取App实例,但是返回nu... 目录vue3组件中getCurrentInstajavascriptnce()获取App实例,但是返回n

基于Java实现回调监听工具类

《基于Java实现回调监听工具类》这篇文章主要为大家详细介绍了如何基于Java实现一个回调监听工具类,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 目录监听接口类 Listenable实际用法打印结果首先,会用到 函数式接口 Consumer, 通过这个可以解耦回调方法,下面先写一个

使用Java将DOCX文档解析为Markdown文档的代码实现

《使用Java将DOCX文档解析为Markdown文档的代码实现》在现代文档处理中,Markdown(MD)因其简洁的语法和良好的可读性,逐渐成为开发者、技术写作者和内容创作者的首选格式,然而,许多文... 目录引言1. 工具和库介绍2. 安装依赖库3. 使用Apache POI解析DOCX文档4. 将解析

Java字符串处理全解析(String、StringBuilder与StringBuffer)

《Java字符串处理全解析(String、StringBuilder与StringBuffer)》:本文主要介绍Java字符串处理全解析(String、StringBuilder与StringBu... 目录Java字符串处理全解析:String、StringBuilder与StringBuffer一、St

springboot整合阿里云百炼DeepSeek实现sse流式打印的操作方法

《springboot整合阿里云百炼DeepSeek实现sse流式打印的操作方法》:本文主要介绍springboot整合阿里云百炼DeepSeek实现sse流式打印,本文给大家介绍的非常详细,对大... 目录1.开通阿里云百炼,获取到key2.新建SpringBoot项目3.工具类4.启动类5.测试类6.测

Spring Boot循环依赖原理、解决方案与最佳实践(全解析)

《SpringBoot循环依赖原理、解决方案与最佳实践(全解析)》循环依赖指两个或多个Bean相互直接或间接引用,形成闭环依赖关系,:本文主要介绍SpringBoot循环依赖原理、解决方案与最... 目录一、循环依赖的本质与危害1.1 什么是循环依赖?1.2 核心危害二、Spring的三级缓存机制2.1 三