后台controller返回json对象----Jackson
1.我们使用Jackson
应该是目前比较好的json解析工具了
2.导入Jackson的jar包
<dependency> <groupId>com.fasterxml.jackson.core</groupId> <artifactId>jackson-databind</artifactId> <version>2.9.8</version> </dependency>
3.web-xml的配置,注册servlet,添加过滤器
<?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> <filter> <filter-name>encoding</filter-name> <filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class> <init-param> <param-name>encoding</param-name> <param-value>utf-8</param-value> </init-param> </filter> <filter-mapping> <filter-name>encoding</filter-name> <url-pattern>/</url-pattern> </filter-mapping> </web-app>
4.配置springmvc-servlet.xml
<?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.chen.controller"/> <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> </beans>
5.实现User实体类
6.实现controller类
方法上面使用@ResponseBody  //写上这个注解,这个方法返回的字符串就不会提交给视图解析器了。和controller类的@@Controller配套使用
使用jackson实现controller类中返回json字符串!一个类ObjectMapper
使用这个ObjectMapper对象的              mapper.writeValueAsString(对象)  就可以把指定返回一个json字符串了
@Controller public class JSONcontroller { @RequestMapping("/j1") @ResponseBody //写上这个注解,这个方法返回的字符串就不会提交给视图解析器了。和controller类的@@Controller配套使用 public String j1() throws JsonProcessingException { User user = new User("陈1", 18, "男"); ObjectMapper objectMapper = new ObjectMapper(); String s = objectMapper.writeValueAsString(user); //返回一个json字符串 return s; } }
测试:又遇到了烦人的乱码问题了!

乱码解决办法:在springmvc的配置文件中添加StringHttpMessageConverter转换配置!以后使用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>

7.扩展
7.1上面的方法上面我们使用了@ResponseBody注解,我们每写一个返回json字符串的方法都要加一遍。
这个@ResponseBody是配合@Controller一起使用的,实现方法返回的字符串不交给视图解析器解析
7.2 我们可以使用@RestController注解作用在这个controller类上,代替@Controller注解,使得它这个类中的每个方法返回的字符串都不交给视图解析器
8.将集合返回json字符串到前台
    @RequestMapping("/j2")
   //这个测试代码的controller类上面使用了@RestController。我们这就不使用@ResponseBody了
    public String j2() throws JsonProcessingException {
        List<User> list = new ArrayList<User>();
        User user1 = new User("陈1", 18, "男");
        User user2 = new User("陈2", 18, "男");
        User user3 = new User("陈3", 18, "男");
        list.add(user1);
        list.add(user2);
        list.add(user3);
        ObjectMapper objectMapper = new ObjectMapper();
        String liststring = objectMapper.writeValueAsString(list);
        return liststring;
    }
测试页面中括号表示集合
       
9.将日期转换为json字符串
  

以上的原因是:Jackson 默认是会把时间转成timestamps形式
我修改代码,让他不使用timestamps格式,直接把日期转换为自己想要的格式
两种方式:
  
    @RequestMapping("/j3")
    public String j3() throws JsonProcessingException {
        ObjectMapper mapper = new ObjectMapper();
        Date date = new Date();
        //自定义日期格式对象
        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
        //方法一:直接格式化日期格式并输出
        //String str = mapper.writeValueAsString(sdf.format(date));
        //方法二:设置ObjectMapper的默认时间戳格式为false,并设置他的格式为我们设置的格式要求
        //不使用默认时间戳格式
        mapper.configure(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS, false);
        //指定日期格式
        mapper.setDateFormat(sdf);
        String str = mapper.writeValueAsString(date);
        
        return str;
    }
  
10.将转换时间戳格式的方法抽取为工具类
package com.chen.util; import com.fasterxml.jackson.core.JsonProcessingException; import com.fasterxml.jackson.databind.ObjectMapper; import com.fasterxml.jackson.databind.SerializationFeature; import java.text.SimpleDateFormat; public class timeJsonUtil { public static String getJson(Object object) throws JsonProcessingException { return getJson(object,"yyyy-MM-dd HH:mm:ss"); } public static String getJson(Object object,String dateFormat) throws JsonProcessingException { ObjectMapper mapper = new ObjectMapper(); //不使用时间差的方式 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; } }
使用工具类实现时间转换为json字符串
  
 
                    
                
                
            
        
浙公网安备 33010602011771号