首页 > 其他分享 >SpringMVC 转换ajax的json数据乱码问题

SpringMVC 转换ajax的json数据乱码问题

时间:2023-06-04 16:35:47浏览次数:46  
标签:charset contentType SpringMVC Charset 乱码 color json jackson import


在spring mvc3中,已经集成了Jackson(json处理器)来处理数据输出json格式,spring中封装的类是 [color=blue]org.springframework.http.converter.json.MappingJackson2HttpMessageConverter[/color]这个json转换器, 如果是[color=red]springmvc3.2[/color]之前的版本,可以使用[color=blue]org.springframework.http.converter.MappingJacksonHttpMessageConverter[/color]这个json转换器。


[size=x-large][color=red]springmvc使用@ResponseBody返回json乱码解决方法[/color][/size] [url]http://www.itxxz.com/a/javashili/ask/2014/1222/501.html[/url]
[color=blue][b]1.springmvc 3.2以上的版本解决乱码的方法:[/b][/color]

[b]  第一步:在配置中加入:[/b]

<mvc:annotation-driven>
        <mvc:message-converters register-defaults="true">
            <bean class="org.springframework.http.converter.StringHttpMessageConverter">
                <constructor-arg value="UTF-8" />
            </bean>
            <bean class="org.springframework.http.converter.json.MappingJackson2HttpMessageConverter">
                <property name="objectMapper">
                     <bean class="org.springframework.http.converter.json.Jackson2ObjectMapperFactoryBean">
                         <property name="failOnEmptyBeans" value="false" />
                     </bean>
                 </property>
            </bean>
        </mvc:message-converters>
     </mvc:annotation-driven>


或者可以这样写


<bean class="org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter">
		<property name="messageConverters">
			<list>
				<ref bean="jsonRequestConverter" />
			</list>
		</property>
	</bean>
	<bean id="jsonRequestConverter" class="org.springframework.http.converter.json.MappingJackson2HttpMessageConverter"/>




[b]  第二步:需要的加入的jackson jar如下:[/b]



<dependency>

        <groupId>com.fasterxml.jackson.core</groupId>

        <artifactId>jackson-annotations</artifactId>

        <version>2.1.0</version>

      </dependency>

      <dependency>

        <groupId>com.fasterxml.jackson.core</groupId>

        <artifactId>jackson-core</artifactId>

        <version>2.1.0</version>

      </dependency>

      <dependency>

        <groupId>com.fasterxml.jackson.core</groupId>

        <artifactId>jackson-databind</artifactId>

        <version>2.1.0</version>

      </dependency>

      <dependency>

        <groupId>com.fasterxml.jackson.module</groupId>

        <artifactId>jackson-module-jaxb-annotations</artifactId>

        <version>2.1.0</version>

      </dependency>





[b]另一种方法:[/b], [color=red]貌似偶尔出问题, 还没找原因[/color]


package cn.com.voge.utils;

import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.io.UnsupportedEncodingException;
import java.nio.charset.Charset;
import java.util.ArrayList;
import java.util.List;

import org.springframework.http.HttpInputMessage;
import org.springframework.http.HttpOutputMessage;
import org.springframework.http.MediaType;
import org.springframework.http.converter.AbstractHttpMessageConverter;
import org.springframework.http.converter.HttpMessageNotReadableException;
import org.springframework.http.converter.HttpMessageNotWritableException;
import org.springframework.util.FileCopyUtils;

public class UTF8StringHttpMessageConverter extends
		AbstractHttpMessageConverter<String> {

	public static final Charset DEFAULT_CHARSET = Charset.forName("UTF-8");
	private final List<Charset> availableCharsets;

	public UTF8StringHttpMessageConverter() {
		this(DEFAULT_CHARSET);
	}

	public UTF8StringHttpMessageConverter(Charset defaultCharset) {
		super(new MediaType("text", "plain", defaultCharset), MediaType.ALL);
		this.availableCharsets = new ArrayList<Charset>(Charset
				.availableCharsets().values());
	}

	@Override
	protected boolean supports(Class<?> clazz) {
		return String.class.equals(clazz);
	}

	@Override
	protected String readInternal(Class<? extends String> clazz,
			HttpInputMessage inputMessage) throws IOException,
			HttpMessageNotReadableException {
		MediaType contentType = inputMessage.getHeaders().getContentType();
		Charset charset = contentType.getCharSet() != null ? contentType
				.getCharSet() : DEFAULT_CHARSET;
		return FileCopyUtils.copyToString(new InputStreamReader(inputMessage
				.getBody(), charset));
	}

	@Override
	protected void writeInternal(String t, HttpOutputMessage outputMessage)
			throws IOException, HttpMessageNotWritableException {
		MediaType contentType = outputMessage.getHeaders().getContentType();
		Charset charset = contentType.getCharSet() != null ? contentType
				.getCharSet() : DEFAULT_CHARSET;
		FileCopyUtils.copy(t, new OutputStreamWriter(outputMessage.getBody(),
				charset));
	}

	protected List<Charset> getAcceptedCharsets() {
		return this.availableCharsets;
	}

	@Override
	protected Long getContentLength(String s, MediaType contentType) {
		if (contentType != null && contentType.getCharSet() != null) {
			Charset charset = contentType.getCharSet();
			try {
				return (long) s.getBytes(charset.name()).length;
			} catch (UnsupportedEncodingException ex) {
				throw new InternalError(ex.getMessage());
			}
		} else {
			return null;
		}
	}
}


<mvc:annotation-driven>   
	    <mvc:message-converters register-defaults="true">   
	        <bean class="cn.com.voge.utils.UTF8StringHttpMessageConverter"/>   
	    </mvc:message-converters>   
	</mvc:annotation-driven>




[b][color=blue]2.springmvc 3.1解决中文乱码的方法:[/color][/b]


[b]  第一步:在配置文件中加入以下代码: [/b]


<mvc:annotation-driven>

    <mvc:message-converters register-defaults="true">

      <bean class="com.util.spring.UTF8StringHttpMessageConverter"/>

    </mvc:message-converters>

  </mvc:annotation-driven>


[b] 第二步:自定义一个编码转换类:[/b]


public class UTF8StringHttpMessageConverter extends 
        AbstractHttpMessageConverter<String> { 

      public static final Charset DEFAULT_CHARSET = Charset.forName("UTF-8"); 
      private final List<Charset> availableCharsets; 

      public UTF8StringHttpMessageConverter() { 
          this(DEFAULT_CHARSET); 
      } 

      public UTF8StringHttpMessageConverter(Charset defaultCharset) { 
          super(new MediaType("text", "plain", defaultCharset), MediaType.ALL); 
          this.availableCharsets = new ArrayList<Charset>(Charset .availableCharsets().values()); 
      } 

      @Override 
      protected boolean supports(Class<?> clazz) { 
          return String.class.equals(clazz); 
      } 

      @Override 
      protected String readInternal(Class<? extends String> clazz, 
              HttpInputMessage inputMessage) throws IOException, 
              HttpMessageNotReadableException { 
          MediaType contentType = inputMessage.getHeaders().getContentType(); 
          Charset charset = contentType.getCharSet() != null ? contentType.getCharSet() : DEFAULT_CHARSET; 
          return FileCopyUtils.copyToString(new InputStreamReader(inputMessage .getBody(), charset)); 
      } 

      @Override 
      protected void writeInternal(String t, HttpOutputMessage outputMessage) 
              throws IOException, HttpMessageNotWritableException { 
          MediaType contentType = outputMessage.getHeaders().getContentType(); 
          Charset charset = contentType.getCharSet() != null ? contentType .getCharSet() : DEFAULT_CHARSET; 
          FileCopyUtils.copy(t, new OutputStreamWriter(outputMessage.getBody(),  charset)); 
      } 

      protected List<Charset> getAcceptedCharsets() { 
          return this.availableCharsets; 
      } 

      @Override 
      protected Long getContentLength(String s, MediaType contentType) { 
          if (contentType != null && contentType.getCharSet() != null) { 
              Charset charset = contentType.getCharSet(); 
              try { 
                  return (long) s.getBytes(charset.name()).length; 
              } catch (UnsupportedEncodingException ex) {                 
                  throw new InternalError(ex.getMessage()); 
              } 
          } else { 
              return null; 
          } 
      } 
  }


[b] 第三步:加入需要的jackson包:[/b]


<dependency>
        <groupId>org.codehaus.jackson</groupId>
        <artifactId>jackson-core-asl</artifactId>
        <version>1.8.8</version>
      </dependency>
      <dependency>
        <groupId>org.codehaus.jackson</groupId>
        <artifactId>jackson-mapper-asl</artifactId>
        <version>1.8.8</version>
      </dependency>

标签:charset,contentType,SpringMVC,Charset,乱码,color,json,jackson,import
From: https://blog.51cto.com/u_3871599/6410946

相关文章

  • SpringMVC3.2.x + Hibernate4.2.x + ecache + Spring Security 3.0.5
    这只是部分代码,一些代码可以参考:[url]http://panyongzheng.iteye.com/blog/1871418[/url]SpringSecurity3.1最新配置实例[url它自带的附件也上传。SpringSecurity3十五日研究[url]http://www.blogjava.net/SpartaYew/archive/2013/09/23/350630.html[/......
  • Spring返回json格式数据的三种方式
    SVN多版本库环境的搭建OAuth2.0是什么?看这篇文章就够了。前端JavaPython等资源合集大放送目前前后端分离大行其道,如何进行前后分类是各个项目需要考虑的问题。如何使用Spring进行前后端分离呢?返回json格式数据是前后端分离的最佳选择。下面介绍使用Spring进行前后端分离的常用三......
  • 【整套视频】spring / springmvc+mybatis
    Spring常用注解redis视频集合,看完这些别说不会redisday88-js对象.rarday87-项目部署和面试指导10.rarday86-订单流程09.rarday85-购物车和订单提交08.rarday84-单品页查询静态化07.rarday83-用户登录和个人中心06.rarday82-商品审核上架和首页筛选05.rarday81-商品添加04.rarday80-......
  • Spring RestTemplate 调用天气预报接口乱码的解决
    SpringRestTemplate调用天气预报接口可能遇到中文乱码的问题,解决思路如下。问题出现我们在网上找了一个免费的天气预报接口http://wthrcdn.etouch.cn/weather_mini?citykey=101280601。我们希望调用该接口,并将返回的数据解析为JSON格式。核心业务逻辑如下:privateWeatherRespo......
  • c# xml、json相互转换
    stringjsonString="{\"Table\":{\"Row\":[{\"Name\":\"张三\",\"Age\":\"20\"},{\"Name\":\"李四\",\"Age\":\"25\"}]}}";......
  • 《面试1v1》SpringMVC
    我是javapub,一名Markdown程序员从......
  • json结构比较问题
    两个json字符串结构一样,但是单纯比较字符串不一样解决:fastjson2这个依赖亲测直接equals方法就可以比较出来,但是json得要JSON.parseObject或者parseArrary解析出来的对象,如果是自己造的对象,可以先转字符串再转对象......
  • springmvc实现
    一、实现方式①基于xml②基于注解二、配置springmvc1、配置web.xml的servlet的转发类点击查看代码<?xmlversion="1.0"encoding="UTF-8"?><web-appxmlns="http://xmlns.jcp.org/xml/ns/javaee"xmlns:xsi="http://www.w3.org/2001/XMLSc......
  • json 注意点
    1、特殊符号\n的转换逻辑importjsonx={'test':"测试\n"}#python中的字典结构x_json=json.dumps(x,ensure_ascii=False)x_json#'{"test":"测试\\n"}'这里看上去稍微有一点特殊,本质就是转义json字符串。print(x_json)#{"test&qu......
  • URL中文乱码问题
    我们主要通过两种形式提交向服务器发送请求:URL、表单。而表单形式一般都不会出现乱码问题,乱码问题主要是在URL上面。通过前面几篇博客的介绍我们知道URL向服务器发送请求编码过程实在是实在太混乱了。不同的操作系统、不同的浏览器、不同的网页字符集,将导致完全不同的编码结果。如......