SpringBoot自定义返回值类型,格式转换等

springmvc默认采用MappingJackson2HttpMessageConverter将dto对象序列化为Json字符串,如果不加配置的话,返回的json数据中 时间格式可能不是很直观。笔者发现改变jackson的配置来实现这一需求。

方案一

配置文件中添加

spring:
    jackson:
        date-format: yyyy-MM-dd HH:mm:ss

方案二
如果想进一步对jackson进行配置(比如BigDecimal转化为String),可以使用这种方式。


/**
 * 时间配置
 * BigDecimal转String配置
 * Null值处理
 */
@Configuration
public class WebMvcConfiguration implements WebMvcConfigurer {


//通过springmvc提供的配置接口
    @Override
    public void extendMessageConverters(List> converters) {
        //配置jackson
        converters.stream().filter(c -> c instanceof MappingJackson2HttpMessageConverter).forEach(cvt -> {
            MappingJackson2HttpMessageConverter converter = (MappingJackson2HttpMessageConverter) cvt;
            ObjectMapper objectMapper = converter.getObjectMapper();
            objectMapper.setDateFormat(new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"));
            objectMapper.setTimeZone(TimeZone.getDefault());

            //处理null值
            objectMapper.getSerializerProvider().setNullValueSerializer(NullValueJsonSerializer.instance);
            //objectMapper.setSerializationInclusion(JsonInclude.Include.NON_NULL);
            //通过该方法对mapper对象进行设置,所有序列化的对象都将按改规则进行系列化
            //Include.Include.ALWAYS 默认
            //Include.NON_DEFAULT 属性为默认值不序列化
            //Include.NON_EMPTY 属性为 空(“”) 或者为 NULL 都不序列化
            //Include.NON_NULL 属性为NULL 不序列化


            SimpleModule module = new SimpleModule();
            module.addSerializer(BigDecimal.class, BigDecimalToStringSerializer.instance);
            objectMapper.registerModule(module);

        });
    }


    public static class NullValueJsonSerializer extends JsonSerializer {

        public static final NullValueJsonSerializer instance = new NullValueJsonSerializer();

        @Override
        public void serialize(Object o, JsonGenerator jsonGenerator, SerializerProvider serializerProvider) throws IOException {

            String fieldName = jsonGenerator.getOutputContext().getCurrentName();
            try {
                Field field = jsonGenerator.getCurrentValue().getClass().getDeclaredField(fieldName);
                if (Objects.equals(field.getType(), String.class)) {
                    //字符串型空值""
                    jsonGenerator.writeString("");
                } else if (Objects.equals(field.getType(), Collection.class)) {
                    //列表型空值返回[]
                    jsonGenerator.writeStartArray();
                    jsonGenerator.writeEndArray();
                } else if (Objects.equals(field.getType(), Map.class)) {
                    //map型空值返回{}
                    jsonGenerator.writeStartObject();
                    jsonGenerator.writeEndObject();
                } else if (Objects.equals(field.getType(), Boolean.class)) {
                    //todo Boolean处理待定
                    jsonGenerator.writeBoolean(false);
                } else {
                    jsonGenerator.writeString("");
                }

            } catch (Exception e) {
                e.printStackTrace();
            }

        }
    }

    public static class BigDecimalToStringSerializer extends StdSerializer {
        public static final BigDecimalToStringSerializer instance = new BigDecimalToStringSerializer();

        public BigDecimalToStringSerializer() {
            super(BigDecimal.class);
        }

        @Override
        public boolean isEmpty(SerializerProvider prov, BigDecimal value) {
            return value == null;
        }

        @Override
        public void serialize(BigDecimal bigDecimal, JsonGenerator jsonGenerator, SerializerProvider serializerProvider) throws IOException {
            jsonGenerator.writeString(bigDecimal.toPlainString());
        }
    }
}









你可能感兴趣的:(spring,springmvc,json)