spring controller返回json字符串 @responsebody 乱码

本文介绍如何在Spring MVC中正确地返回JSON格式的数据,并解决中文乱码问题。通过使用@ResponseBody注解将对象转换为JSON字符串返回,同时设置@RequestMapping的produces属性确保字符集正确。

一般情况下,controller的方法返回值是一个字符串时,spring会去找已这个字符串为名的jsp文件。


当需要返回一个json字符串时就会出错。

解决问题的方法是在方法上添加注解@ResponseBody

<span style="white-space:pre">	</span>@RequestMapping(value="showSaleVolumeRank")
	@ResponseBody
	public String showSaleVolumeRank(HttpServletRequest request,
			HttpServletResponse response, Model model)
	{
		
		List<SaleDTO> saleDTOs = new ArrayList<SaleDTO>();
		
		
		saleDTOs.add(new SaleDTO("云南省", 878901.92, 1085429.21));
		saleDTOs.add(new SaleDTO("河北省", 733988.8, 1080040.69));
		saleDTOs.add(new SaleDTO("广西壮族自治区", 691610.0, 975663.98));
		saleDTOs.add(new SaleDTO("湖北省", 585583.33, 1133054.53));
		map.put("sales", saleDTOs);
		Gson gson = new  Gson();
		
		String json = gson.toJson(map);
		System.out.println(json);
		System.out.println("myjson");
		
		return json;
	}

这样的话,在前端就可以用ajax接收到json字符串了。


但是这种情况下,返回的json字符串被jquery接收后,会出现中文乱码问题,中文全部都会变成问号。。。


解决办法是为注解@RequestMapping()配置produces的值。

@RequestMapping(value = "/add", <span style="color:#ff0000;">produces = {"application/json;charset=UTF-8"}</span>)
这样在前端接收到的json字符串就不会出现中文乱码问题了。


Spring MVC 中,当使用 `@ResponseBody` 注解返回 `String` 类型值时,Spring 会使用 `StringHttpMessageConverter` 来处理响应内容。默认情况下,`StringHttpMessageConverter` 使用的字符集是 `ISO-8859-1` 编码[^3]。这可能导致在返回包含中文字符的字符串时出现乱码问题。 为了解决这个问题,可以通过自定义 `StringHttpMessageConverter` 的字符集为 `UTF-8` 来确保正确处理中文字符。在配置文件中,可以对 `<mvc:annotation-driven>` 标签进行扩展,通过 `<mvc:message-converters>` 配置项替换默认的字符集: ```xml <mvc:annotation-driven> <mvc:message-converters> <bean class="org.springframework.http.converter.StringHttpMessageConverter"> <constructor-arg value="UTF-8" /> </bean> </mvc:message-converters> </mvc:annotation-driven> ``` 通过上述配置,`StringHttpMessageConverter` 将使用 `UTF-8` 字符集对返回字符串进行编码,从而避免中文乱码问题[^2]。 此外,如果控制器方法返回的是非 `String` 类型的数据(例如 `Map` 或自定义对象),Spring MVC 会自动将其序列化为客户端请求的内容类型,如 JSON 或 XML。例如,如果客户端请求的是 JSON 数据,Spring MVC 会将返回值转换为 JSON 格式并返回给客户端[^1]。 ### 示例代码 以下是一个典型的控制器方法示例,展示如何通过 `@ResponseBody` 返回 `String` 类型值: ```java @Controller public class ExampleController { @GetMapping("/greet") @ResponseBody public String greet() { return "你好,世界!"; // 返回的中文字符串 } } ``` 若未配置字符集为 `UTF-8`,客户端可能会接收到乱码的中文响应内容。通过配置 `StringHttpMessageConverter` 使用 `UTF-8` 编码,可以确保返回字符串在客户端正确显示。 ### 总结 - `@ResponseBody` 返回 `String` 类型时,默认使用 `ISO-8859-1` 编码,可能导致中文乱码。 - 通过配置 `StringHttpMessageConverter` 使用 `UTF-8` 编码,可以解决乱码问题。 - 对于非 `String` 类型的返回值,Spring MVC 会根据客户端请求的内容类型进行序列化。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值