【Java开发】之 Long 类型序列化成 String

一、情景介绍


在项目开发过程中,当后端返回给前端的类型为 Long 类型时,如果值超过了前端 js 显示的长度范围的话会导致数字精度丢失,但我们又不想变更字段的类型,此时我们可以在序列化返回时将 Long 类型转换成 String 类型。


二、转换方式


1、使用 @JsonSerialize 注解
import com.fasterxml.jackson.databind.annotation.JsonSerialize;
import com.fasterxml.jackson.databind.ser.std.ToStringSerializer;

public class Demo {

	@JsonSerialize(using = ToStringSerializer.class)
    private Long uid;
    
}

注意: 该注解生效的类型必须是包装类,如果是原生的类型比如 long 会转换失败。

2、使用全局配置

使用 @JsonSerialize 有很大的局限性,就是需要在每个要转换的类型上添加该注解,所以,我们可以通过 WebMvcConfigurer 来实现全局序列化:

import com.fasterxml.jackson.core.JsonGenerator;
import com.fasterxml.jackson.databind.JsonSerializer;
import com.fasterxml.jackson.databind.SerializerProvider;
import com.fasterxml.jackson.databind.module.SimpleModule;
import org.springframework.context.annotation.Configuration;
import org.springframework.http.converter.HttpMessageConverter;
import org.springframework.http.converter.json.MappingJackson2HttpMessageConverter;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;

import java.io.IOException;
import java.util.List;

/**
 * @author 王廷云
 */
@Configuration
public class ShopWebConfig implements WebMvcConfigurer {

    /**
     * 注册自定义类型转换器
     */
    @Override
    public void configureMessageConverters(List<HttpMessageConverter<?>> converters) {
        // 获取Json转换器
        MappingJackson2HttpMessageConverter converter = (MappingJackson2HttpMessageConverter) converters.get(0);
        // 转换Long和long类型
        SimpleModule module = new SimpleModule();
        module.addSerializer(Long.class, new LongToStringSerializer());
        module.addSerializer(long.class, new LongToStringSerializer());
        // 将自定义序列化器注册进Json转换器中
        converter.getObjectMapper().registerModule(module);
    }

    /**
     * 自定义LongToString序列化器
     */
    public static class LongToStringSerializer extends JsonSerializer<Long> {
        @Override
        public void serialize(Long value, JsonGenerator gen, SerializerProvider serializers) throws IOException {
            if (null != value) {
                gen.writeString(value.toString());
            } else {
                gen.writeNull();
            }
        }
    }
}

有了该配置类之后就会全局生效序列化结果。

你可能感兴趣的:(Java,java)