SpringMVC(11) —— Jackson使用


1.Controller返回JSON数据

  • Jackson应该是目前比较好的json解析工具了

  • 当然工具不止这一个,比如还有阿里巴巴的 fastjson 等等

  • 我们这里使用Jackson,使用它需要导入它的jar包

    <!-- https://mvnrepository.com/artifact/com.fasterxml.jackson.core/jackson-databind -->
    <dependency>
        <groupId>com.fasterxml.jackson.core</groupId>
        <artifactId>jackson-databind</artifactId>
        <version>2.11.2</version>
    </dependency>
    
  • 配置web.xml(配置dispatcherservlet和过滤器),固定的配置,直接拷贝即可

    <?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">
        <!--DispatcherServlet注册-->
        <servlet>
            <servlet-name>DispatcherServlet</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>
        <servlet-mapping>
            <servlet-name>DispatcherServlet</servlet-name>
            <!--拦截所有请求-->
            <url-pattern>/</url-pattern>
        </servlet-mapping>
    
        <!--springMVC提供的字符乱码过滤器-->
        <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>
    
  • 创建实体类

    package com.thhh.pojo;
    
    import lombok.AllArgsConstructor;
    import lombok.Data;
    import lombok.NoArgsConstructor;
    
    @Data
    @AllArgsConstructor
    @NoArgsConstructor
    public class User {
        private int id;
        private String name;
      private int age;
    }
    
  • 创建controller 【先尝试直接返回对象看效果】

    package com.thhh.controller;
    
    import com.thhh.pojo.User;
    import org.springframework.stereotype.Controller;
    import org.springframework.web.bind.annotation.RequestMapping;
    import org.springframework.web.bind.annotation.ResponseBody;
    
    @Controller
    public class UserController {
       @RequestMapping("u/j")
       @ResponseBody   //使用了这个注解,返回的东西不会走视图解析器,而是直接返回一个字符串给前端
       public String json(){
          User user = new User(1,"张三",18);
          return user.toString();
       }
    }
    

在这里插入图片描述

1.测试对象数据通过JSON格式返回

package com.thhh.controller;

import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.thhh.pojo.User;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;

@Controller
public class UserController {
    @RequestMapping("u/j")
    @ResponseBody   //使用了这个注解,返回的东西不会走视图解析器,而是直接返回一个字符串给前端
    public String json() throws JsonProcessingException {

        //jackson中的objectMapper类
        ObjectMapper mapper = new ObjectMapper();//获取工具对象

       User user = new User(1,"张三",18);

        String str = mapper.writeValueAsString(user);//调用方法将对象转为JSON字符串
        
        return str;
    }
}

在这里插入图片描述

  • 解决乱码问题
    我们可以通过注解 @RequestMapping的produces属性来解决
    @RequestMapping(path = "/u/j",produces = "text/plain;charset=UTF-8")
    
    在这里插入图片描述
  • 但是,每返回一个JSON数据我们就需要配置一次,显然还是很麻烦,所以springMVC也为我们提供了一个一劳永逸的方法:在spring容器中添加以下配置,但是注意,这个配置只能解决我们使用jackson处理json数据时的乱码,当我们使用其他的工具,像Alibaba的fastjson的时候,这个配置就没用
    <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>
    

在这里插入图片描述
在这里插入图片描述

2.测试集合数据通过JSON格式返回

    @RequestMapping("/u/j2")
    @ResponseBody   //使用了这个注解,返回的东西不会走视图解析器,而是直接返回一个字符串给前端
    public String json2() throws JsonProcessingException {
        ObjectMapper mapper = new ObjectMapper();//获取工具对象

        User user1 = new User(1,"张三1",18);
        User user2 = new User(2,"张三2",18);
        User user3 = new User(3,"张三3",18);
        User user4 = new User(4,"张三4",18);
        List<User> list = new ArrayList<User>();
        list.add(user1);
        list.add(user2);
        list.add(user3);
        list.add(user4);
        String str = mapper.writeValueAsString(list);//调用方法将对象转为JSON字符串

        return str;
    }

在这里插入图片描述

  • ‘[ ]’ 表示JSON中的一个集合
  • { } 表示JSON中的一个对象

3.测试时间数据通过JSON格式返回

    @RequestMapping("/u/j3")
    public String json3() throws JsonProcessingException {
        Date date = new Date();//获取时间
        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");//控制输出格式
        return new ObjectMapper().writeValueAsString(sdf.format(date));//使用jackson返回JSON数据格式的时间字符串到前端显示
    }

在这里插入图片描述
从输出结果我们又验证了JSON数据格式就是一个字符串


2.小结使用Jackson的步骤

  • 导入maven依赖

  • 在spring容器中配置乱码处理问题

  • 在对应的controller类的方法上添加注解@ResponseBody或在controller类上添加注解@RestController

  • 在对应的controller的方法中new一个ObjectMapper对象mapper

  • 调用mapper.writeValueAsString(对象的引用),将对象转为一个字符串

  • 最后将字符串返回出去即可


  • 在对应的controller的方法上添加注解@ResponseBody,让这个方法返回值不走视图解析器,直接返回一个字符串;除了这个注解外,我们还可以使用注解@RestController代替类上的@Controller注解,它的作用就是设置这个controller类中的所有的处理方法返回的值都不走视图解析器,而是直接返回一个字符串
  • 在前后端分离的情况下,我们一般就不会走视图解析器,因为视图是前端人员开发的,我们开发的时候拿不到前端页面,所以在前后端分离的情况下,我们一般都是使用@RestController返回一个JSON字符串,这就是一个数据接口,前端直接拿去用就行了
  • 而上面说的@ResponseBody它是配合@Controller来使用的,用于controller类中的某些方法返回值不走视图解析器

3.封装JSON工具类

在这里插入图片描述

package com.thhh.utils;

import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.databind.SerializationFeature;

import java.text.SimpleDateFormat;

public class JsonUtil {
    public static String getJson(Object object,String dateFormat){
        ObjectMapper mapper = new ObjectMapper();
        //设置mapper存储的日期数据不使用时间戳格式存储时间数据
        mapper.configure(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS,false);
        //自定义时间格式
        SimpleDateFormat sdf = new SimpleDateFormat(dateFormat);
        mapper.setDateFormat(sdf);//设置mapper中的时间格式为我们指定的格式

        try {
            return mapper.writeValueAsString(object);//返回转换后的JSON数据格式
        } catch (JsonProcessingException e) {
            e.printStackTrace();
        }

        return null;
    }
}

在这里插入图片描述

    上面这个工具类就对传入时间数据转JSON数据格式进行了封装,我们可以测试一下

@RequestMapping("/u/j3")
public String json3() throws JsonProcessingException {
    Date date = new Date();//获取时间
    return JsonUtil.getJson(date,"yyyy-MM-dd HH:mm:ss");
}

在这里插入图片描述

    但是我们大多数情况下也不是只传递日期数据的,还可能传递其他的数据需要将它们转为JSON数据格式传到前端进行解析,那么此时我们就可以对我们的工具类实现重载

public static String getJson(Object object){
    return getJson(object,"yyyy-MM-dd HH:mm:ss");
}

    直接复用上面的方法即可,这样的思想很重要,在JDK源码中很常见
    测试效果
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
    对比使用工具类之前和之后,我们可以发现有了很大的差别,抽象出工具类大大简化了我们的代码,也提高了代码的复用,并且在重载的时候我们尽量调用原来就有的方法,通过修改传入的参数来实现不同的需求

  • 5
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Spring MVC是一个基于Java的Web框架,它提供了很多简化Web开发的功能。其中一个常用的功能是处理HTTP请求和响应。而Jackson-databind是一个Java库,用于将Java对象与JSONJavaScript Object Notation)之间进行相互转换。 在Spring MVC中,我们可以使用Jackson-databind来处理请求和响应中的JSON数据。具体来说,我们可以使用Jackson-databind的ObjectMapper类来将JSON数据转换为Java对象,或将Java对象转换为JSON数据。 例如,我们可以在Spring MVC中定义一个Controller,用于处理来自客户端的HTTP请求,并返回一个Java对象,然后使用Jackson-databind将该Java对象转换为JSON数据,以便客户端可以使用该数据进行相应的操作。 示例代码如下: ```java @Controller public class MyController { @GetMapping("/myendpoint") @ResponseBody public MyObject handleRequest() { // 处理请求,返回一个 MyObject 对象 MyObject obj = new MyObject(); obj.setProperty1("value1"); obj.setProperty2("value2"); return obj; } // 使用 Jackson-databind 将 MyObject 对象转换为 JSON 数据 @GetMapping(value = "/myendpoint", produces = MediaType.APPLICATION_JSON_VALUE) @ResponseBody public ResponseEntity<String> handleRequest() throws JsonProcessingException { MyObject obj = new MyObject(); obj.setProperty1("value1"); obj.setProperty2("value2"); ObjectMapper mapper = new ObjectMapper(); String json = mapper.writeValueAsString(obj); HttpHeaders headers = new HttpHeaders(); headers.setContentType(MediaType.APPLICATION_JSON); return new ResponseEntity<String>(json, headers, HttpStatus.OK); } } ``` 在上面的示例中,我们定义了一个Spring MVC的Controller,该Controller处理来自客户端的HTTP请求,并返回一个MyObject对象。随后,我们使用Jackson-databind将该对象转换为JSON数据,并将其返回给客户端。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值