springboot对接口请求返回数值为null时的处理,同意改成 空字符串 ““

1.Jackson 中对 null 的处理

Jackson 是在web依赖里就有的
springboot对接口请求返回数值为null时的处理,同意改成 空字符串 ““

在实际项目中,我们难免会遇到一些 null 值的出现,我们转 JSON 时,不希望这些 null 出现,比如我们期望所有的 null 在转 JSON 时都变成 “” 这种空字符串,那怎么做呢?在 Spring Boot 中,我们做一下配置即可,新建一个 Jackson 的配置类:

@Configuration
public class JacksonConfig {
    @Bean
    @Primary
    @ConditionalOnMissingBean(ObjectMapper.class)
    public ObjectMapper jacksonObjectMapper(Jackson2ObjectMapperBuilder builder) {
        ObjectMapper objectMapper = builder.createXmlMapper(false).build();
        objectMapper.getSerializerProvider().setNullValueSerializer(new JsonSerializer<Object>() {
            @Override
            public void serialize(Object o, JsonGenerator jsonGenerator, SerializerProvider serializerProvider) throws IOException {
                jsonGenerator.writeString("");
            }
        });
        return objectMapper;
    }
}

当还没有配置这个JacksonConfig 的时候,后台返回的是有null字段的
springboot对接口请求返回数值为null时的处理,同意改成 空字符串 ““
配置后
springboot对接口请求返回数值为null时的处理,同意改成 空字符串 ““

测试controller如下:

@RestController
@RequestMapping("/json")
public class JsonController {

    @RequestMapping("/user")
    public User getUser() {
        return new User(1, "laomi", "123456");
    }

    @RequestMapping("/list")
    public List<User> getUserList() {
        List<User> userList = new ArrayList<>();
        User user1 = new User(1, "laomi", "123456");
        User user2 = new User(2, "test", "123456");
        userList.add(user1);
        userList.add(user2);
        return userList;
    }

    @RequestMapping("/map")
    public Map<String, Object> getMap() {
        Map<String, Object> map = new HashMap<>(3);
        User user = new User(1, "laomi", "123456");
        map.put("作者信息", user);
        map.put("博客地址", "http://blog.laomi.com");
        map.put("CSDN地址", null);
        map.put("粉丝数量", 2400);
        return map;
    }
}

测试IP:http://localhost:8080/json/map

2.使用阿里巴巴 fastjson 对null的处理

从扩展上来看,fastjson 没有 Jackson 灵活,从速度或者上手难度来看,fastjson 比较方便。
不像Jackson ,fastjson 是需要另外导入依赖的,

<dependency>
    <groupId>com.alibaba</groupId>
    <artifactId>fastjson</artifactId>
    <version>1.2.35</version>
</dependency>

对 null 的处理和 Jackson 有些不同,需要继承 WebMvcConfigurationSupport 类,然后覆盖 configureMessageConverters 方法。在方法中,我们可以选择要实现 null 转换的场景,配置好即可:

@Configuration
public class fastJsonConfig extends WebMvcConfigurationSupport {

    /**
     * 使用阿里 fastjson 作为JSON MessageConverter
     * @param converters
     */
    @Override
    public void configureMessageConverters(List<HttpMessageConverter<?>> converters) {
        FastJsonHttpMessageConverter converter = new FastJsonHttpMessageConverter();
        FastJsonConfig config = new FastJsonConfig();
        config.setSerializerFeatures(
                // 保留map空的字段
                SerializerFeature.WriteMapNullValue,
                // 将String类型的null转成""
                SerializerFeature.WriteNullStringAsEmpty,
                // 将Number类型的null转成0
                SerializerFeature.WriteNullNumberAsZero,
                // 将List类型的null转成[]
                SerializerFeature.WriteNullListAsEmpty,
                // 将Boolean类型的null转成false
                SerializerFeature.WriteNullBooleanAsFalse,
                // 避免循环引用
                SerializerFeature.DisableCircularReferenceDetect);

        converter.setFastJsonConfig(config);
        converter.setDefaultCharset(Charset.forName("UTF-8"));
        List<MediaType> mediaTypeList = new ArrayList<>();
        // 解决中文乱码问题,相当于在Controller上的@RequestMapping中加了个属性produces = "application/json"
        mediaTypeList.add(MediaType.APPLICATION_JSON);
        converter.setSupportedMediaTypes(mediaTypeList);
        converters.add(converter);
    }
}
上一篇:fastjson


下一篇:Android开发之FastJson概述与简单使用,Android岗面试