long转string java_fastjson将Long类型转换成String类型,解决前后端交互,Java序列化JSON丢失精度问题的方法...

注明:本文摘自来源于其他博客

后端把Long类型的数据序列化成JSON后传给前端,前端可能会出现精度丢失的情况。

例如:201511200001725439这样一个Long类型的整数,传给前端后会变成201511200001725440

解决方法:

方法一:在后台将这个Long类型的字段转换成String类型的,风险比较大。

方法二:使用fastjson的提供的注解,@JSONField(serializeUsing = ToStringSerializer.class)。

需要导入包:

import com.alibaba.fastjson.annotation.JSONField;

import com.alibaba.fastjson.serializer.ToStringSerializer;

@JSONField(serializeUsing = ToStringSerializer.class)private Long id;

备注:

fastjson在com.alibaba.fastjson.serializer包下面提供了多种数据类型转换的注解。

自己也可以拓展这些注解,通过实现ObjectSerializer接口来完成。

ToStringSerializer的代码:

public classToStringSerializer implements ObjectSerializer {public static final ToStringSerializer instance = newToStringSerializer();

@Overridepublic void write(JSONSerializer serializer, Object object, Object fieldName, Type fieldType,intfeatures) throws IOException {

SerializeWriterout = serializer.out;if (object == null) {out.writeNull();return;

}

String strVal= object.toString();out.writeString(strVal);

}

}

@Configurationpublic classSessionConfig implements WebMvcConfigurer{

@Overridepublic void configureMessageConverters(List>converters) {

FastJsonHttpMessageConverter fastJsonConverter= newFastJsonHttpMessageConverter();

FastJsonConfig fjc= newFastJsonConfig();/**

* 序列换成json时,将所有的long变成string

* 因为js中得数字类型不能包含所有的java long值*/SerializeConfig serializeConfig=SerializeConfig.globalInstance;

serializeConfig.put(Long.class, ToStringSerializer.instance);

serializeConfig.put(Long.TYPE , ToStringSerializer.instance);

fjc.setSerializeConfig(serializeConfig);

fastJsonConverter.setFastJsonConfig(fjc);

converters.add(fastJsonConverter);

}

}

@ResponseBody用fastjson输出fastjson将long转为String输出

js遇到long过长,精度损失,所以改为使用string来传输,但是将long字段改成String的代价太大了,所以直接让fastjson吧long转换成了String

但是@ResponseBody 返回的是Jackson来序列化的,所以要让spring的消息转换器换成fastjson

maven 添加配置:

com.alibaba

fastjson

1.2.45

1. 配置@ResponseBody使用fastjson

text/html;charset=UTF-8

application/json

application/xml;charset=UTF-8

WriteMapNullValue

WriteNullNumberAsZero

WriteNullListAsEmpty

WriteNullStringAsEmpty

WriteNullBooleanAsFalse

WriteDateUseDateFormat

2. Long转String

import java.io.IOException;

import java.lang.reflect.Type;

import com.alibaba.fastjson.serializer.JSONSerializer;

import com.alibaba.fastjson.serializer.ObjectSerializer;

import com.alibaba.fastjson.serializer.SerializeWriter;public classLongToStringSerializer implements ObjectSerializer {public static final LongToStringSerializer instance = newLongToStringSerializer();

@Overridepublic void write(JSONSerializer serializer, Object object, Object fieldName, Type fieldType, intfeatures)

throws IOException {

SerializeWriterout = serializer.out;if (object == null) {out.writeNull();return;

}

String strVal= object.toString();out.writeString(strVal);

}

}

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值