SpringMvc04-JSON
Posted q1748819552
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了SpringMvc04-JSON相关的知识,希望对你有一定的参考价值。
这里使用了两种方式:第一种是使用jackson依赖,第二种使用fastjson依赖:
两个依赖如下
<dependencies> <dependency> <groupId>com.fasterxml.jackson.core</groupId> <artifactId>jackson-databind</artifactId> <version>2.10.0</version> </dependency> <!-- https://mvnrepository.com/artifact/com.alibaba/fastjson --> <dependency> <groupId>com.alibaba</groupId> <artifactId>fastjson</artifactId> <version>1.2.62</version> </dependency>
1.先创建一个User类,方便之后转换为json使用
package com.he.pojo; public class User { String name; int age; String sex; public User() { } public User(String name, int age, String sex) { this.name = name; this.age = age; this.sex = sex; } public String getName() { return name; } public void setName(String name) { this.name = name; } public int getAge() { return age; } public void setAge(int age) { this.age = age; } public String getSex() { return sex; } public void setSex(String sex) { this.sex = sex; } @Override public String toString() { return "User{" + "name=‘" + name + ‘‘‘ + ", age=" + age + ", sex=‘" + sex + ‘‘‘ + ‘}‘; } }
2.配置好web.xml跟springmvc-servlet.xml
<?xml version="1.0" encoding="UTF-8"?> <web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd" version="4.0"> <!--1.注册servlet--> <servlet> <servlet-name>SpringMVC</servlet-name> <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class> <!--通过初始化参数指定SpringMVC配置文件的位置,进行关联--> <init-param> <param-name>contextConfigLocation</param-name> <param-value>classpath:springmvc-servlet.xml</param-value> </init-param> <!-- 启动顺序,数字越小,启动越早 --> <load-on-startup>1</load-on-startup> </servlet> <!--所有请求都会被springmvc拦截 --> <servlet-mapping> <servlet-name>SpringMVC</servlet-name> <url-pattern>/</url-pattern> </servlet-mapping> </web-app>
<?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:context="http://www.springframework.org/schema/context" xmlns:mvc="http://www.springframework.org/schema/mvc" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/context https://www.springframework.org/schema/context/spring-context.xsd http://www.springframework.org/schema/mvc https://www.springframework.org/schema/mvc/spring-mvc.xsd"> <!-- 自动扫描包,让指定包下的注解生效,由IOC容器统一管理 --> <context:component-scan base-package="com.he.controller"/> <!-- 让Spring MVC不处理静态资源(jsp.heml.js...) --> <mvc:default-servlet-handler /> <mvc:annotation-driven /> <!-- 视图解析器 --> <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver" id="internalResourceViewResolver"> <!-- 前缀 --> <property name="prefix" value="/WEB-INF/jsp/" /> <!-- 后缀 --> <property name="suffix" value=".jsp" /> </bean> <!--解决json乱码问题--> <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> </beans>
3.直接编写Controller的实现类(使用jackson的方式)
@RestController//这个注解后下面的类不走视图解析器了,返回字符串 public class UserController { //这里乱码使用配置文件解决,在springmvc-servlet.xml中 @RequestMapping("/json1") public String json1() throws JsonProcessingException { //jackson,ObjectMapper ObjectMapper mapper = new ObjectMapper(); //创建一个对象 User user = new User("静静", 19, "女"); //将String转化为json模式 String writer = mapper.writeValueAsString(user); return writer; } @RequestMapping("/json2") public String json2() throws JsonProcessingException { ObjectMapper mapper = new ObjectMapper(); List<User>list = new ArrayList<User>(); User user1 = new User("静静1", 19, "女"); User user2 = new User("静静2", 19, "女"); User user3 = new User("静静3", 19, "女"); User user4 = new User("静静4", 19, "女"); list.add(user1); list.add(user2); list.add(user3); list.add(user4); //将String转化为json模式 String str = mapper.writeValueAsString(list); return str; } }
使用jackson将java转换为json的主要步骤1.创建ObjectMapper对象。
2.调用这个对象的writeValueAsString方法,传入java对象即可。
如果只想让一个方法不被视图解析器解析而不是整个类的话,可以使用@ResponseBody 跟@RestController功能类似不被视图解析器,返回字符串。
注意:有可能遇见乱码问题
解决json的乱码问题提供两种方式,第一种使用@RequestMapping,在produces中设置即可
@RequestMapping(value = "/json1",produces = "application/json;charset=utf-8")
解决json乱码的第二种方式(推荐),使用配置,配置在springmvc的配置文件中
<!--解决json乱码问题--> <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>
3.2 JSON跟JAVA之间的转换(使用fastjson)
@RequestMapping("/json4") public String fastjson() { //一下演示的是fastjson的使用 List<User>list = new ArrayList<User>(); User user1 = new User("静静1", 19, "女"); User user2 = new User("静静2", 19, "女"); User user3 = new User("静静3", 19, "女"); User user4 = new User("静静4", 19, "女"); list.add(user1); list.add(user2); list.add(user3); list.add(user4); //JAVA对象转JSON字符串 String s = JSON.toJSONString(list); //JSON字符串转JAVA对象 User user = JSON.parseObject(s, User.class); //JAVA对象转JSON对象 JSONObject o = (JSONObject) JSON.toJSON(user); //JSON对象转JAVA对象 User u2 = JSON.toJavaObject(o,User.class); return s; }
拓展:使用jackson转换日期类型:
如果直接转换日期类型会返回时间戳,而不是我们平常的日期类型,解决方法有两种
第一种:使用SimpleDateFormat设置自定义日期类型,然后再传入
@RequestMapping("/json3") public String json3() throws JsonProcessingException { ObjectMapper mapper = new ObjectMapper(); Date date = new Date(); SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); String format = sdf.format(date); //只解析Date,默认为格式为时间戳(Timestamp) //解析自定义后的就是:"2020-03-13 13:32:55" String str = mapper.writeValueAsString(format); return str; }
第二种:使用ObjectMapper中的configure,关闭时间戳
@RequestMapping("/json5") public String json4() throws JsonProcessingException { ObjectMapper mapper = new ObjectMapper(); //不用时间戳,false mapper.configure(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS,false); //自定义日期 SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); //指定日期格式 mapper.setDateFormat(sdf); Date date = new Date(); String str = mapper.writeValueAsString(date); return str; }
第二种方式明显比第一种方式要麻烦许多,如果要经常使用建议写成工具类
这里我们使用重载,顺便把JAVA转换为JSON也封装到了里面。以后如果需要转换直接调用方法即可
package com.he.pojo; import com.fasterxml.jackson.core.JsonProcessingException; import com.fasterxml.jackson.databind.ObjectMapper; import com.fasterxml.jackson.databind.SerializationFeature; import java.text.SimpleDateFormat; //不用SimpleDateFormat解决时间戳的方式 public class jsonUtils { public static String getJson(Object object){ return getJson(object,"yyyy-MM-dd HH:mm:ss"); } public static String getJson(Object object,String dateFormat){ ObjectMapper mapper = new ObjectMapper(); //不使用时间戳的方式,false是关闭时间戳 mapper.configure(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS,false); //自定义日期格式 SimpleDateFormat sdf = new SimpleDateFormat(dateFormat); mapper.setDateFormat(sdf); try { return mapper.writeValueAsString(object); } catch (JsonProcessingException e) { e.printStackTrace(); } return null; } }
工具类测试:
//工具类日期测试 @RequestMapping("/json6") public String json6(){ Date date = new Date(); String json = jsonUtils.getJson(date, "yyyy-MM-dd"); return json; } //工具类对象测试 @RequestMapping("/json7") public String json7(){ User user = new User("静静1", 19, "女"); String json = jsonUtils.getJson(user); return json; }
结果:
以上是关于SpringMvc04-JSON的主要内容,如果未能解决你的问题,请参考以下文章
Spring+SpringMVC+MyBatis+Maven框架整合