Long类型参数传到前端精度丢失的解决方案
一、问题的描述
二、问题的解决
(1)提出方案
(2)查询资料
SerializeFilter是通过编程扩展的方式定制序列化。fastjson支持6种SerializeFilter,用于不同场景的定制序列化。具体如下:
PropertyPreFilter 根据PropertyName判断是否序列化
PropertyFilter 根据PropertyName和PropertyValue来判断是否序列化
NameFilter 修改Key,如果需要修改Key,process返回值则可
ValueFilter 修改Value
BeforeFilter 序列化时在最前添加内容
AfterFilter 序列化时在最后添加内容
x
SerializeFilter是通过编程扩展的方式定制序列化。fastjson支持6种SerializeFilter,用于不同场景的定制序列化。具体如下:
PropertyPreFilter 根据PropertyName判断是否序列化
PropertyFilter 根据PropertyName和PropertyValue来判断是否序列化
NameFilter 修改Key,如果需要修改Key,process返回值则可
ValueFilter 修改Value
BeforeFilter 序列化时在最前添加内容
AfterFilter 序列化时在最后添加内容
(3)实战代码
- <1>自定义序列化Filter
package com.kangxiinfo.wechat.common.fastjson;
import com.alibaba.fastjson.serializer.ValueFilter;
/**
* Long类型变成String类型——json序列化Filter
* @author ZENG.XIAO.YAN
* @time 2018-11-08 14:50:19
* @version v1.0
*/
public class LongToStringSerializeFilter implements ValueFilter {
@Override
public Object process(Object object, String name, Object value) {
if (value != null) {
// 当value不为null时,如果value是Long类型的就改成String
if (value instanceof Long) {
return value.toString();
}
}
return value;
}
}
package com.kangxiinfo.wechat.common.fastjson;
import com.alibaba.fastjson.serializer.ValueFilter;
/**
* Long类型变成String类型——json序列化Filter
* @author ZENG.XIAO.YAN
* @time 2018-11-08 14:50:19
* @version v1.0
*/
public class LongToStringSerializeFilter implements ValueFilter {
@Override
public Object process(Object object, String name, Object value) {
if (value != null) {
// 当value不为null时,如果value是Long类型的就改成String
if (value instanceof Long) {
return value.toString();
}
}
return value;
}
}
- <2>自定义JsonHttpMessageConverter
package com.kangxiinfo.wechat.common.fastjson;
import java.io.IOException;
import java.io.OutputStream;
import java.nio.charset.Charset;
import org.springframework.http.HttpOutputMessage;
import org.springframework.http.converter.HttpMessageNotWritableException;
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.serializer.SerializerFeature;
import com.alibaba.fastjson.support.spring.FastJsonHttpMessageConverter;
public class CustomFastJsonHttpMessageConverter extends FastJsonHttpMessageConverter {
public final static Charset UTF8 = Charset.forName("UTF-8");
private Charset charset = UTF8;
private SerializerFeature[] features = new SerializerFeature[0];
/** 自定义的filter */
private LongToStringSerializeFilter longToStringSerializeFilter = new LongToStringSerializeFilter();
public CustomFastJsonHttpMessageConverter() {
super();
}
@Override
protected boolean supports(Class<?> clazz) {
return true;
}
public Charset getCharset() {
return this.charset;
}
public void setCharset(Charset charset) {
this.charset = charset;
}
public SerializerFeature[] getFeatures() {
return features;
}
public void setFeatures(SerializerFeature... features) {
this.features = features;
}
// 重写这个方法
@Override
protected void writeInternal(Object obj, HttpOutputMessage outputMessage)
throws IOException, HttpMessageNotWritableException {
OutputStream out = outputMessage.getBody();
// 转json时 加入自定义的Filter
String text = JSON.toJSONString(obj, longToStringSerializeFilter, features);
byte[] bytes = text.getBytes(charset);
out.write(bytes);
}
}
package com.kangxiinfo.wechat.common.fastjson;
import java.io.IOException;
import java.io.OutputStream;
import java.nio.charset.Charset;
import org.springframework.http.HttpOutputMessage;
import org.springframework.http.converter.HttpMessageNotWritableException;
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.serializer.SerializerFeature;
import com.alibaba.fastjson.support.spring.FastJsonHttpMessageConverter;
public class CustomFastJsonHttpMessageConverter extends FastJsonHttpMessageConverter {
public final static Charset UTF8 = Charset.forName("UTF-8");
private Charset charset = UTF8;
private SerializerFeature[] features = new SerializerFeature[0];
/** 自定义的filter */
private LongToStringSerializeFilter longToStringSerializeFilter = new LongToStringSerializeFilter();
public CustomFastJsonHttpMessageConverter() {
super();
}
@Override
protected boolean supports(Class<?> clazz) {
return true;
}
public Charset getCharset() {
return this.charset;
}
public void setCharset(Charset charset) {
this.charset = charset;
}
public SerializerFeature[] getFeatures() {
return features;
}
public void setFeatures(SerializerFeature... features) {
this.features = features;
}
// 重写这个方法
@Override
protected void writeInternal(Object obj, HttpOutputMessage outputMessage)
throws IOException, HttpMessageNotWritableException {
OutputStream out = outputMessage.getBody();
// 转json时 加入自定义的Filter
String text = JSON.toJSONString(obj, longToStringSerializeFilter, features);
byte[] bytes = text.getBytes(charset);
out.write(bytes);
}
}
- <3>在SpringMVC配置文件中配置使用我们自定义的Json转换器
<mvc:annotation-driven>
<mvc:message-converters register-defaults="false">
<!-- 注册我们扩展了的fastjson转换器 -->
<bean class="com.kangxiinfo.wechat.common.fastjson.CustomFastJsonHttpMessageConverter">
<property name="supportedMediaTypes">
<list>
<value>text/html;charset=UTF-8</value>
<value>application/json;charset=UTF-8</value>
<value>text/plain;charset=UTF-8</value>
<value>application/x-www-form-urlencoded;charset=UTF-8</value>
</list>
</property>
<property name="features">
<list>
<value>WriteMapNullValue</value>
<value>WriteNullListAsEmpty</value>
<value>WriteNullStringAsEmpty</value>
<value>WriteNullNumberAsZero</value>
</list>
</property>
</bean>
</mvc:message-converters>
</mvc:annotation-driven>
<mvc:annotation-driven>
<mvc:message-converters register-defaults="false">
<!-- 注册我们扩展了的fastjson转换器 -->
<bean class="com.kangxiinfo.wechat.common.fastjson.CustomFastJsonHttpMessageConverter">
<property name="supportedMediaTypes">
<list>
<value>text/html;charset=UTF-8</value>
<value>application/json;charset=UTF-8</value>
<value>text/plain;charset=UTF-8</value>
<value>application/x-www-form-urlencoded;charset=UTF-8</value>
</list>
</property>
<property name="features">
<list>
<value>WriteMapNullValue</value>
<value>WriteNullListAsEmpty</value>
<value>WriteNullStringAsEmpty</value>
<value>WriteNullNumberAsZero</value>
</list>
</property>
</bean>
</mvc:message-converters>
</mvc:annotation-driven>
三、小结
(1)Long类型数据传到前端精度丢失时,可以将Long类型转成String类型再输出到前端就不会丢失精度(2)可以通过扩展SpringMVC的消息转换器,全局处理这种Long类型数据精度丢失的问题
Long类型参数传到前端精度丢失的解决方案的更多相关文章
- 后端Long类型传到前端精度丢失的正确解决方式
原因:前端js对Long类型支持的精度不够,导致后端使用的Long传到前端丢失精度,比如现在分布式id生成算法"雪花算法"在使用中就会出现问题. 解决方式: 1.后端的Long类型 ...
- 计算价格, java中浮点数精度丢失的解决方案
计算价格, java中浮点数精度丢失的解决方案
- Spring MVC自定义消息转换器(可解决Long类型数据传入前端精度丢失的问题)
1.前言 对于Long 类型的数据,如果我们在Controller层通过@ResponseBody将返回数据自动转换成json时,不做任何处理,而直接传给前端的话,在Long长度大于17位时会出现精度 ...
- Long类型数据前端精度丢失
问题描述 后端把Long类型的数据传给前端,前端可能会出现精度丢失的情况.例如:201511200001725439这样一个Long类型的整数,传给前端后会变成201511200001725440 相 ...
- .Net Core 配置之long类型 前端精度丢失和时间格式设置
在很多项目中,都采用的前后端分离的方式进行开发,经常遇到后台的long精度的数据到前端丢失不准确,显示效果为long类型(19位)的后几位为000,此时需要对long的字段进行设置,改变默认的返回类型 ...
- springboot中关于Long类型返回前端精度丢失问题处理
使用了HuTool这个雪花算法后,会出现丢失精度的问题 hutool算法使用地址 对于一些大的业务表,自增主键这里 接口层得注意下是否会产生大数值 设计接口的时候采用String类型. 在项目中,我们 ...
- javascript(js)小数精度丢失的解决方案
原因:js按照2进制来处理小数的加减乘除,在arg1的基础上 将arg2的精度进行扩展或逆扩展匹配,所以会出现如下情况. javascript(js)的小数点加减乘除问题,是一个js的bug如0.3* ...
- 后端传Long类型至前端js会出现精度丢失问题
今天开发遇到个问题,Java后端的Long类型数据,传到前端会出现精度丢失,如:164379764419858435,前端会变成164379764419858430.在浏览器中做测试可知,这就是一个精 ...
- 后端传给前端Long类型数据,导致精度丢失
1.前几天遇到了一个问题,后端向前端传递一个Long类型的数据,前端拿到的值不对. 2.当Long类型的数据大于17位时候,就会出现精度丢失的情况. 3.解决办法 我们采用的解决方案是将后端的Long ...
随机推荐
- Android代码书写规范
1.资源文件命名规则2.类名文件命名规则3.尽量少用枚举4.public方法.重要逻辑.主要类结构体必须注释,其他部分可自定注释5.提交代码必须描述清楚修改内容,如果一次提交内容过多,拆分功能进行多次 ...
- wangEditor更改默认高度
在使用WangEditor时觉得高度太低,默认是300px;想调下高度,借鉴https://blog.csdn.net/qq_31384551/article/details/83240188, 网址 ...
- Android view层
当屏幕可以装下内容的时候,他们的值相等,只有当view超出屏幕后,才能看出他们的区别:getMeasuredHeight()是实际View的大小,与屏幕无关,而getHeight的大小此时则是屏幕的大 ...
- 实现wc部分功能 java
GitHub地址:https://github.com/carlylewen/ruangong 相关要求 基本功能 wc.exe -c file.c //返回文件 file.c 的字符数(实现 ...
- [转] Scala 中的异步事件处理
在任何并发性应用程序中,异步事件处理都至关重要.无论事件的来源是什么(不同的计算任务.I/O 操作或与外部系统的交互),您的代码都必须跟踪事件,协调为响应它们而执行的操作.应用程序可以采用两种基本方法 ...
- Spark性能优化【Stack Overflow】
一.异常情况 Stack Overflow 二.异常分析 之所以会产生Stack Overflow,原因是在Stack方法栈中方法的调用链条太长的原因导致的,一般情况有两种: 1.过于深度的递归[常见 ...
- Cas 服务器 Service(Cas客户端)注册信息维护
作为Cas服务器,允许哪些客户端接入与否是通过配置来定义的.对Cas服务器来说,每一个接入的客户端与一个Service配置对应:在Cas服务器启动时加载并注册上这些Service,与之对应的客户端才能 ...
- django 下载文件
方法一. from django.http import StreamingHttpResponse def big_file_download(request): # do something... ...
- web前端(2)—— 前端技术介绍
前端技术 前文了解了什么是前端,那么前端技术到底有哪些呢?最核心的就这三个: html/html5 css/css3 javascript 什么是HTML HyperText Markup Langu ...
- SQL Server 一致性读
我们在Oracle和MySQL数据库中已经对一致性读的概念比较熟悉了,但是在SQL Server中却鲜少提及,但SQL Server自2005版本以来其实也实现了一致性读,几乎所有关系型数据库产品的一 ...