Controller返回自定义对象自动转JSON格式
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"));//优先级最低