Long类型在java种最大长度是19位,前端获取到该数据时,最大支持的进度不到19位,剩余位数由0补充,然后前端把数据传送给后台时,与真实数据出现差别。此时就需要把Long类型转换成String类型,防止数据进度丢失,转换方式以下几种:
1、给实体对象的Long类型的属性加注解@JsonFormat(shape = JsonFormat.Shape.STRING)
import com.fasterxml.jackson.annotation.JsonFormat;
import lombok.Data;
@Data
public class TestDemo {
@JsonFormat(shape = JsonFormat.Shape.STRING)
private Long id;
private String name;
}
2、返回类型在实体对象种转换成String
import lombok.Data;
@Data
public class TestDemo {
private String id;
private String name;
}
3、springboot 添加配置信息
@Configuration
public class LongToStringJsonConfig extends WebMvcConfigurationSupport {
public void configureMessageConverters(List<HttpMessageConverter<?>> converters) {
MappingJackson2HttpMessageConverter jackson2HttpMessageConverter = new MappingJackson2HttpMessageConverter();
ObjectMapper objectMapper = new ObjectMapper();
SimpleModule simpleModule = new SimpleModule();
simpleModule.addSerializer(Long.class, ToStringSerializer.instance);
simpleModule.addSerializer(Long.TYPE, ToStringSerializer.instance);
objectMapper.registerModule(simpleModule);
jackson2HttpMessageConverter.setObjectMapper(objectMapper);
converters.add(jackson2HttpMessageConverter);
}
}
以上是Long转换成String的几种方法,不过还有其他的方式,就不介绍了。
关于JsonFormat注解会在几种情况下失效:
1、用gson包种JsonObject 对象,添加实体类,然后返回给前端时失效,返回的还是Long类型,
TestDemo testDemo = new TestDemo();
testDemo.setId(1234567890123456789l);
testDemo.setName("ceshi");
jsonObject.addProperty("json",newGsonBuilder().serializeNulls().create().toJson(testDemo));
接口调用时候返回的json数据为:{"json":"{\"id\":1234567890123456789,\"name\":\"ceshi\"}"}
解决方案:添加代码:.setLongSerializationPolicy(LongSerializationPolicy.STRING)
TestDemo testDemo = new TestDemo();
testDemo.setId(1234567890123456789l);
testDemo.setName("ceshi");
jsonObject.addProperty("json",new GsonBuilder().serializeNulls().setLongSerializationPolicy(LongSerializationPolicy.STRING).create().toJson(testDemo));
2、用net.sf.json-lib下的JsonObject的时候,也会导致注解JsonFormat失效,此时把JsonObject 换成Map此时JsonFormat注解又可以生效了
其他情况后续再整理!!!!!