• 04、Springboot中使用Jackson


    1、SpringMVC中默认集成

    SpringMVC已经默认集成了JackSon,如下所示:

        @RequestMapping("/addUserInfo")
        public UserInfo addUserInfo(@RequestBody UserInfo userInfo){
    
        }

    可以用UserInfo对象来接前台传过来的json,SpringMVC已经帮我们自动反序列化。

     可以看到,在SpringBoot中,只需要导入web starter,不需要添加其他的依赖,就可以使用Jackson。

    2、时间格式化

    在序列化的过程中,如果有Date格式,我们可以通过下面几种方式来对时间字段进行格式化。

    2.1、注解方式

    通过添加JsonFormat注解,可以固定日期格式。

    public class UserInfo {
    
        private String name;
    
        private String password;
    
        private Integer age;
    
        @JsonFormat(pattern = "yyyy-MM-dd")
        private Date birth;

    也可以通过这个注解指定时区(time zone)

    2.2、重写bean

    也可以重新 JacksonHttpMessageConvertersConfiguration 类中的bean

    @Configuration
    public class WebMvcConfig {
    
        @Bean
        MappingJackson2HttpMessageConverter mappingJackson2HttpMessageConverter() {
            MappingJackson2HttpMessageConverter mappingJackson2HttpMessageConverter = new MappingJackson2HttpMessageConverter();
            ObjectMapper objectMapper = new ObjectMapper();
            objectMapper.setDateFormat(new SimpleDateFormat("yyyy/MM/dd"));
            mappingJackson2HttpMessageConverter.setObjectMapper(objectMapper);
            return mappingJackson2HttpMessageConverter;
        }
    
    }

    在JacksonHttpMessageConvertersConfiguration这个类中,原来的方法是:

     @ConditionalOnClass({ObjectMapper.class})
        @ConditionalOnBean({ObjectMapper.class})
        @ConditionalOnProperty(
            name = {"spring.mvc.converters.preferred-json-mapper"},
            havingValue = "jackson",
            matchIfMissing = true
        )
        static class MappingJackson2HttpMessageConverterConfiguration {
            MappingJackson2HttpMessageConverterConfiguration() {
            }
    
            @Bean
            @ConditionalOnMissingBean(
                value = {MappingJackson2HttpMessageConverter.class},
                ignoredType = {"org.springframework.hateoas.server.mvc.TypeConstrainedMappingJackson2HttpMessageConverter", "org.springframework.data.rest.webmvc.alps.AlpsJsonHttpMessageConverter"}
            )
            MappingJackson2HttpMessageConverter mappingJackson2HttpMessageConverter(ObjectMapper objectMapper) {
                return new MappingJackson2HttpMessageConverter(objectMapper);
            }
        }

    这是最新的版本的spring,与之前版本的略有差异,不过可以看到,给 mappingJackson2HttpMessageConverter方法注入了一个ObjectMapper,那么我们可不可以直接修改ObjectMapper呢?当然可以,在Jackson的自动配置类(JacksonAutoConfiguration)中,可以发现:

    @ConditionalOnClass({Jackson2ObjectMapperBuilder.class})
        static class JacksonObjectMapperConfiguration {
            JacksonObjectMapperConfiguration() {
            }
    
            @Bean
            @Primary
            @ConditionalOnMissingBean
            ObjectMapper jacksonObjectMapper(Jackson2ObjectMapperBuilder builder) {
                return builder.createXmlMapper(false).build();
            }
        }

    在这个内部类里,提供了ObjectMapper。所以我们可以直接重新这个Bean,也可以达到全局修改日期格式的作用。

    @Configuration
    public class WebMvcConfig {
    
    
        @Bean
        ObjectMapper jacksonObjectMapper() {
            ObjectMapper objectMapper = new ObjectMapper();
            objectMapper.setDateFormat(new SimpleDateFormat("yyyy-MM-dd"));
            return objectMapper;
        }
    }

    经过测试,注解方式的优先级要高于下面的两种。

    3、Jackson的简单使用

        //测试jackSon
        public static void main(String[] args) throws JsonProcessingException {
            UserInfo userInfo = getTestUser();
            ObjectMapper objectMapper = new ObjectMapper();
    
            //将对象序列化为json字符串
            objectMapper.setSerializationInclusion(JsonInclude.Include.NON_NULL); //忽略为null的字段
            String userJsonString = objectMapper.writerWithDefaultPrettyPrinter().writeValueAsString(userInfo);
            System.out.println(userJsonString);
    
    
            //将json反序列化为java对象
            objectMapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);
            UserInfo userInfo2 = objectMapper.readValue(userJsonString, UserInfo.class);
            System.out.println(userInfo2);
        }
     
  • 相关阅读:
    可能是最简单的解决本地开发接口请求跨域问题的方案
    《Visual Studio程序员箴言》笔记
    vue后台项目记录
    新版本微信导致的ios表单bug
    longzhuapp项目笔记
    Session、LocalStorage、SessionStorage、Cache-Ctrol比较
    css3实现不同进度条
    axios请求接口的踩坑之路
    实现不同尺寸的图片在固定的区块内实现水平垂直居中
    for循环查找元素怎么跳出for循环
  • 原文地址:https://www.cnblogs.com/phdeblog/p/13234842.html
Copyright © 2020-2023  润新知