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 Jackson核心注解使用详解

《JavaJackson核心注解使用详解》:本文主要介绍JavaJackson核心注解的使用,​​Jackson核心注解​​用于控制Java对象与JSON之间的序列化、反序列化行为,简化字段映射... 目录前言一、@jsonProperty-指定JSON字段名二、@JsonIgnore-忽略字段三、@Jso

Spring Validation中9个数据校验工具使用指南

《SpringValidation中9个数据校验工具使用指南》SpringValidation作为Spring生态系统的重要组成部分,提供了一套强大而灵活的数据校验机制,本文给大家介绍了Spring... 目录1. Bean Validation基础注解常用注解示例在控制器中应用2. 自定义约束验证器定义自

Java对接Dify API接口的完整流程

《Java对接DifyAPI接口的完整流程》Dify是一款AI应用开发平台,提供多种自然语言处理能力,通过调用Dify开放API,开发者可以快速集成智能对话、文本生成等功能到自己的Java应用中,本... 目录Java对接Dify API接口完整指南一、Dify API简介二、准备工作三、基础对接实现1.

9个SpringBoot中的自带实用过滤器使用详解

《9个SpringBoot中的自带实用过滤器使用详解》在SpringBoot应用中,过滤器(Filter)是处理HTTP请求和响应的重要组件,SpringBoot自带了许多实用的过滤器,如字符编码,跨... 目录1. CharacterEncodingFilter - 字符编码过滤器功能和配置手动配置示例2

Spring Boot Controller处理HTTP请求体的方法

《SpringBootController处理HTTP请求体的方法》SpringBoot提供了强大的机制来处理不同Content-Type​的HTTP请求体,这主要依赖于HttpMessageCo... 目录一、核心机制:HttpMessageConverter​二、按Content-Type​处理详解1.

Spring Boot 常用注解详解与使用最佳实践建议

《SpringBoot常用注解详解与使用最佳实践建议》:本文主要介绍SpringBoot常用注解详解与使用最佳实践建议,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要... 目录一、核心启动注解1. @SpringBootApplication2. @EnableAutoConfi

Android与iOS设备MAC地址生成原理及Java实现详解

《Android与iOS设备MAC地址生成原理及Java实现详解》在无线网络通信中,MAC(MediaAccessControl)地址是设备的唯一网络标识符,本文主要介绍了Android与iOS设备M... 目录引言1. MAC地址基础1.1 MAC地址的组成1.2 MAC地址的分类2. android与I

全解析CSS Grid 的 auto-fill 和 auto-fit 内容自适应

《全解析CSSGrid的auto-fill和auto-fit内容自适应》:本文主要介绍了全解析CSSGrid的auto-fill和auto-fit内容自适应的相关资料,详细内容请阅读本文,希望能对你有所帮助... css  Grid 的 auto-fill 和 auto-fit/* 父元素 */.gri

Springboot实现推荐系统的协同过滤算法

《Springboot实现推荐系统的协同过滤算法》协同过滤算法是一种在推荐系统中广泛使用的算法,用于预测用户对物品(如商品、电影、音乐等)的偏好,从而实现个性化推荐,下面给大家介绍Springboot... 目录前言基本原理 算法分类 计算方法应用场景 代码实现 前言协同过滤算法(Collaborativ

Python与Java交互出现乱码的问题解决

《Python与Java交互出现乱码的问题解决》在现代软件开发中,跨语言系统的集成已经成为日常工作的一部分,特别是当Python和Java之间进行交互时,编码问题往往会成为导致数据传输错误、乱码以及难... 目录背景:为什么会出现乱码问题产生的场景解决方案:确保统一的UTF-8编码完整代码示例总结在现代软件