欢迎光临
我们一直在努力

如何在SpringMVC中实现Json数据格式的高效转换?

在SpringMVC中,Json数据格式转换是一个常见的需求,以下是关于如何在SpringMVC中进行Json数据格式转换的详细解析:

概述

在SpringMVC中,HttpMessageConverter<T>接口负责将请求参数转换成Java类型参数(类型为T),或者将Java类型数据写入到HTTP响应体中,为了转换Json格式数据,需要使用Json的消息转换器进行处理,常用的Json消息转换器是MappingJackson2HttpMessageConverter,它是HttpMessageConverter接口的一种实现。

SpringMVC中Json数据格式转换

环境配置

1. jar包准备

SpringMVC默认使用MappingJackson2HttpMessageConverter对json数据进行转换,需要加入jackson的包,如下:

jacksonannotations2.8.8.jar:JSON转换注解包;

jacksoncore2.8.8.jar:JSON转换核心包;

jacksondatabind2.8.8.jar:JSON转换的数据绑定包。

2. springmvc.xml文件中的配置

如果配置文件中配置过注解驱动(<mvc:annotationdriven/>),则无需多余配置。

如果没有配置注解驱动,则需如下配置(不推荐使用这种方式):

<!注解适配器 >
<bean class="org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter">
    <property name="messageConverters">
        <list>
            <bean class="org.springframework.http.converter.json.MappingJackson2HttpMessageConverter"></bean>
        </list>
    </property>
</bean>

Controller的编写

1. @RequestBody

作用:@RequestBody注解用于读取HTTP请求的内容(字符串),通过SpringMVC提供的HttpMessageConverter接口将读到的内容转换为json、xml等格式的数据并绑定到controller方法的参数上。

示例:接收http请求的json数据,将json数据转换为java对象。

@RequestMapping("/requestJson")
@ResponseBody
public User requestJson(@RequestBody User user) throws Exception{
    System.out.println(user);
    return user; //由于@ResponseBody注解,将user转成json格式返回
}

2. @ResponseBody

SpringMVC中Json数据格式转换

作用:该注解用于将Controller的方法返回的对象,通过HttpMessageConverter接口转换为指定格式的数据如:json,xml等,通过Response响应给客户端。

示例:将controller方法返回对象转换为json响应给客户端。

@RequestMapping("/showJson2")
@ResponseBody
public User showJsonInfo2(){
    User user3 =new User(3,"小美","333");
    return user3;
}

3. @RestController

作用:在类上添加@RestController注解,可以将该类下所有的控制器方法的返回值都转换成Json格式,从Spring 4.0开始,@RestController注解中包含了@ResponseBody

示例:

@RestController
public class TestController2 {
    @RequestMapping("test2")
    public User getUserJson(){
        User user =new User(1,"第一名","123");
        return user;
    }
}

4. ResponseEntity

作用:ResponseEntity提供了一种更灵活的方式来构建HTTP响应,包括状态码、头部信息和响应体,你可以将JSON对象作为响应体返回。

示例:

@Controller
public class TestController3 {
    @RequestMapping("/testEntity")
    public ResponseEntity<User>getJson(){
        User user =new User(2,"第二名也不错","111");
        return ResponseEntity.ok(user);
    }
}

解决json格式的日期输出的两种办法

1. 第一种:在日期字段上使用注解@JsonFormat

缺点:硬编码,这个是局部处理。

优点:灵活,想给哪个时间字段格式化就给哪个时间字段格式化。

@JsonFormat(pattern="yyyyMMdd HH:mm:ss", timezone="Europe/Zagreb")
private Date lastUpdate;

2. 第二种:在application.yml中进行全局配置

SpringMVC中Json数据格式转换

优点:如果我们要为应用程序中的所有日期都配置默认格式,那么这种配置的方式是最推荐的。

缺点:这种方法存在缺陷,它不适用于Java 8日期类型如LocalDate和LocalDateTime,我们只能使用它来格式化java.util.Date或java.util.Calendar类型的字段。

spring:
  jackson:
    dateformat: yyyyMMdd HH:mm:ss # 
    jodadatetimeformat: yyyyMMdd HH:mm:ss
    timezone: GMT+8

3. 兼容Java8日期格式的全局处理办法

我们需要创建一个Jackson2ObjectMapperBuilderCustomizer的bean对象:

@Configuration
public class ContactAppConfig{
    private static final String dateFormat ="yyyyMMdd";
    private static final String dateTimeFormat ="yyyyMMdd HH:mm:ss";

    @Bean
    public Jackson2ObjectMapperBuilderCustomizer jsonCustomizer(){
        return builder >{ 
            builder.simpleDateFormat(dateTimeFormat);
            //java8日期格式的json处理
            builder.serializers(newLocalDateSerializer(DateTimeFormatter.ofPattern(dateFormat)));
            builder.serializers(newLocalDateTimeSerializer(DateTimeFormatter.ofPattern(dateTimeFormat)));
        };
    }
}

上面的示例它适用于Java 8和遗留日期类型,我们必须定义新的序列化器,以便能够正确地序列化LocalDate和LocalDateTime类型。

相关表格

注解 描述 示例 适用场景
@RequestBody 读取HTTP请求的内容,将其转换为json、xml等格式的数据并绑定到controller方法的参数上 @RequestBody User user 接收HTTP请求中的JSON数据并将其转换为Java对象
@ResponseBody 将Controller的方法返回的对象转换为指定格式的数据如json,xml等,通过Response响应给客户端 @ResponseBody User showJsonInfo2() 将Java对象转换为JSON数据并返回给客户端
@RestController 在类上添加此注解,可以将该类下所有的控制器方法的返回值都转换成Json格式 @RestController public class TestController2 简化开发,使所有方法的返回值自动转换为JSON格式
ResponseEntity 提供一种更灵活的方式来构建HTTP响应,包括状态码、头部信息和响应体 ResponseEntity.ok(user) 构建包含状态码、头部信息和响应体的HTTP响应
@JsonFormat 在日期字段上使用,指定日期的格式化方式 @JsonFormat(pattern="yyyyMMdd HH:mm:ss", timezone="Europe/Zagreb") private Date lastUpdate; 对特定的日期字段进行格式化处理
Jackson2ObjectMapperBuilderCustomizer 自定义Jackson ObjectMapper的配置,如日期格式等 builder.simpleDateFormat(dateTimeFormat); 对整个应用程序进行统一的日期格式设置

相关问题与解答栏目

1、问题:如何在SpringMVC中配置多个HttpMessageConverter

解答:可以通过在springmvc.xml文件中配置多个HttpMessageConverter来实现,可以同时配置StringHttpMessageConverterMappingJackson2HttpMessageConverter,具体配置如下:

   <bean id="stringConverter" class="org.springframework.http.converter.StringHttpMessageConverter">
       <property name="supportedMediaTypes">
           <list>
               <value>text/plain;charset=UTF8</value>  
           </list>
       </property>
   </bean>  
   <bean id="jsonConverter" class="org.springframework.http.converter.json.MappingJackson2HttpMessageConverter"></bean>  
   <bean class="org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter">
       <property name="messageConverters">
           <list>
               <ref bean="stringConverter"/>
               <ref bean="jsonConverter"/>
           </list>
       </property>
   </bean>

这样,SpringMVC就会根据ContentType、Accept等属性自动选择合适的消息转换器。

2、问题:如何在SpringMVC中处理复杂的JSON对象?

解答:对于复杂的JSON对象,可以定义相应的Java类来表示JSON结构,并使用@RequestBody@ResponseBody注解来处理请求和响应,如果有一个包含用户信息的JSON对象,可以定义一个User类,并在Controller中使用@RequestBody来接收JSON数据,使用@ResponseBody来返回JSON数据,具体示例如下:

   public class User {
       private int id;
       private String name;
       private String email;
       // getters and setters...
   }
   @RequestMapping("/user")
   @ResponseBody
   public User getUser() {
       User user = new User();
       user.setId(1);
       user.setName("John Doe");
       user.setEmail("john.doe@example.com");
       return user; // SpringMVC会自动将User对象转换为JSON并返回给客户端
   }

以上就是关于“SpringMVC中Json数据格式转换”的问题,朋友们可以点击主页了解更多内容,希望可以够帮助大家!

赞(0)
版权声明:本文采用知识共享 署名4.0国际许可协议 [BY-NC-SA] 进行授权
文章名称:《如何在SpringMVC中实现Json数据格式的高效转换?》
文章链接:https://yuyunkj.com/article/8512.html
本站资源仅供个人学习交流,请于下载后24小时内删除,不允许用于商业用途,否则法律问题自行承担。

评论 抢沙发