淘先锋技术网

首页 1 2 3 4 5 6 7

Controller返回自定义对象自动转JSON格式

在开发项目的时候,返回给前端的数据,需要将数据封装到集合或者自定义对象中。但是前端需要的是JSON格式的字符串,如果我们将集合或者自定义对象直接返回给前端,前端无法接收到数据。
因此,我们需要将集合或者自定义对象转成JSON格式的字符串,每次使用代码进行转换有点繁琐,我们需要让Spring MVC自动帮我们将集合或者自定义对象转成JSON格式的字符串。
如果是Spring Boot项目,直接返回集合或者自定义对象即可,框架会自动将集合或者字符串自动转成JSON格式的字符串。
如果是SSM项目,使用@RestController或者@ResponseBody注解后,我们还需要添加配置,Spring MVC才能自动将集合或者自定义对象转成JSON格式。

引入需要的依赖

<dependency>
	<groupId>com.fasterxml.jackson.core</groupId>
	<artifactId>jackson-databind</artifactId>
	<version>2.12.3</version>
</dependency>

一、Spring MVC配置文件中引入标签

在Spring MVC的配置文件中引入上述标签,系统会自动注册集合或者自定义对象自动转JSON格式需要的bean。
注意:引入上述标签后,需要在beans中引入以下属性。这些属性只是上述标签需要的。

<beans xmlns:mvc="http://www.springframework.org/schema/mvc"
       xsi:schemaLocation="http://www.springframework.org/schema/mvc
       https://www.springframework.org/schema/mvc/spring-mvc.xsd">

二、自己注册自定义对象转JSON的bean

在Spring MVC的配置文件中注册以下两个bean

<bean id="mappingJacksonHttpMessageConverter" class="org.springframework.http.converter.json.MappingJackson2HttpMessageConverter">
	<property name="supportedMediaTypes">
		<list>
			<value>application/json;charset=UTF-8</value>
		</list>
    </property>
</bean>
<bean class="org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter">
	<property name="messageConverters">
		<list>
			<ref bean="mappingJacksonHttpMessageConverter"/>
		</list>
	</property>
</bean>

推荐使用第一种方式。

采用HttpServletResponse响应JSON字符串

//必须先设置编码格式。解决乱码。
response.setContentType("application/json;charset=utf-8");
PrintWriter writer = response.getWriter();
String jsonString="{\"id\":\"123\",\"json\":\"fal\",\"name\":\"张三\",\"say\":\"Hello , i am a action to print a json!\",\"password\":\"JSON\"}";
writer.print(jsonString);
writer.flush();
writer.close();

直接将要返回的JSON字符串写到HttpServletResponse中,此时方法的返回值可以是void
使用上述方法返回JSON字符串,不设置编码格式会有中文乱码的问题

解决中文乱码

设置编码格式有三种方式

//使用时前端弹窗汉字显示正常,F12查看返回值时汉字乱码
response.setCharacterEncoding("UTF-8");//优先级最高

//使用时前端弹窗汉字显示正常,F12查看返回值汉字显示正常。
response.setContentType("application/json;charset=utf-8");

//解决乱码的方案还有,但是在本项目中不生效,以后再研究:(弹窗和F12查看返回值都乱码)
response.setLocale(new java.util.Locale("zh","CN"));//优先级最低