biginteger和long精度_修复Long类型太长,而Java序列化JSON丢失精度问题的方法

造成原因:JS内置有32位整数,而number类型的安全整数是53位。如果超过53位,则精度会丢失。正如现在后台传来一个64位的Long型整数,因此超过了53位,所以后台返回的值和前台获取的值会不一样。

Java序列化JSON时long型数值,会出现精度丢失的问题。

原因:

java中得long能表示的范围比js中number大,也就意味着部分数值在js中存不下(变成不准确的值).

解决办法一:

使用ToStringSerializer的注解,让系统序列化

时,保留相关精度

@JsonSerialize(using=ToStringSerializer.class)

private Long createdBy;

FastJson 注解

@JSONField(serializeUsing= ToStringSerializer.class)

上述方法需要在每个对象都配上该注解,此方法过于繁锁。

解决办法(二):

使用全局配置,将转换时实现自动ToStringSerializer序列化

Override

public void configureMessageConverters(List> converters) {

MappingJackson2HttpMessageConverter jackson2HttpMessageConverter = new MappingJackson2HttpMessageConverter();

ObjectMapper objectMapper = new ObjectMapper();

/**

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

* 因为js中得数字类型不能包含所有的java long值

*/

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);

项目中很多时候都会用到json,常用的有fastjson,Jackson等等这些,有时候为了统一,我们通常就会约定使用某一种。当然,有时候项目中也可能会统一约定使用了fastjson,然而Spring MVC中默认是使用了Jackson的

在Spring Boot中将Jackson替换为fastjson一般会有两种方式:

第一种:

@Configuration

public class WebConfig extends WebMvcConfigurerAdapter {

@Bean

public HttpMessageConverters fastJsonHttpMessageConverter() {

return new HttpMessageConverters(new FastJsonHttpMessageConverter());

}

}

第二种:

@Configuration

public class WebConfig extends WebMvcConfigurerAdapter {

@Override

public void configureMessageConverters(List> converters) {

FastJsonHttpMessageConverter fastConverter =

new FastJsonHttpMessageConverter();

FastJsonConfig fastJsonConfig = new FastJsonConfig();

fastJsonConfig.setSerializerFeatures(SerializerFeature.PrettyFormat);

fastConverter.setFastJsonConfig(fastJsonConfig);

converters.add(fastConverter);

}

}

替换成fastjson之后,对于精度丢失问题,我们可以这么去做:

@Configuration

public class WebConfig extends WebMvcConfigurerAdapter {

@Override

public void configureMessageConverters(List> converters) {

FastJsonHttpMessageConverter fastConverter =

new FastJsonHttpMessageConverter();

FastJsonConfig fastJsonConfig = new FastJsonConfig();

SerializeConfig serializeConfig = SerializeConfig.globalInstance;

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

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

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

fastJsonConfig.setSerializeConfig(serializeConfig);

fastConverter.setFastJsonConfig(fastJsonConfig);

converters.add(fastConverter);

}

}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/347826.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Java基本语法(15)--while循环结构do-while循环结构

基本格式 ①初始化部分 while(②循环条件部分){③循环体部分;④迭代部分; }①初始化部分; do{③循环体部分;④迭代部分; }while(②循环条件部分);注意不要忘记声明④迭代部分。否则,循环将不能结束,变成死循环。 while循环先判断后循环体&a…

截止角频率和截止频率的关系_开关电源的控制环截止频率和开关频率有什么关系?...

【新朋友】点击上方蓝字“电源之家”关注【老朋友】点击右上角按钮,分享到朋友圈电源之家官方技术③群:522815202(3000人群)(电源行业第一大技术交流QQ群)这个问题很专业,因此答案注定也专业而非科普,非电力电子专业小伙伴看不懂很…

restlet_Restlet框架– Hello World示例

restletRestlet是用于Java平台的轻量级,全面的开源REST框架。 Restlet适用于服务器和客户端Web应用程序。 它支持主要的Internet传输,数据格式和服务描述标准,例如HTTP和HTTPS,SMTP,XML,JSON,At…

mysql数据库表复制备份_mysql数据库的备份以及表格数据之间的复制

#####-------------mysql数据备份以及表间数据的复制-------------------#######----------------我的mysql学习(二)--------------------------#####mysql数据的导入和导出--这里承接上一部分#导出全部数据库该操作在mysql命令行外进行:导出数据格式如下&#xff1…

求100以内质数或者更多

方法① public class JavaTest {public static void main(String[] args) {Label1: for (int i 2;i < 100;i){for (int j 2;j < i;j){if (i % j 0){continue Label1;}};System.out.println(i);}} }方法② public class JavaTest {public static void main(String[] …

在运行时在Spring Cloud Config中刷新属性配置

在本系列Spring Cloud Config的教程系列中&#xff0c;我们将讨论在运行时刷新属性配置的过程&#xff0c;我们将使用Spring Boot致动器/refresh端点进行/refresh 。 此外&#xff0c;我们还将研究使用RefreshScope注释刷新Value属性。 在我的Spring Cloud Config的上一教程中…

pythonnumpy教程_Python学习教程:通俗易懂的Numpy入门教程

Numpy是python语言中最基础和最强大的科学计算和数据处理的工具包&#xff0c;如数据分析工具pandas也是基于numpy构建的&#xff0c;机器学习包scikit-learn也大量使用了numpy方法。本文介绍了Numpy的n维数组在数据处理和分析的所有核心应用。目录如何构建numpy数组如何观察数…

break和continue关键字

break语句用于终止某个语句块的执行&#xff0c;用在循环中表示跳出循环。 continue只能使用在循环结构中&#xff0c;用于跳过其所在循环当次执行&#xff0c;进入下一次循环执行。 二者功能类似&#xff0c;但continue是终止本次循环&#xff0c;break是终止本层循环。 brea…

认识定制:JSON绑定概述系列

让我们看看自定义JSON绑定序列化和反序列化过程时 &#xff0c; 注释模型和运行时配置如何工作。 本系列的下一篇文章介绍JSON-B如何处理自定义对象的创建。 注解方法 使用注释方法&#xff0c;可以通过注释字段&#xff0c;JavaBean方法和类来定制默认的序列化和反序列化行为…

Java数组(1)--数组概述

数组(Array)&#xff0c;是多个相同类型数据按一定顺序排列的集合&#xff0c;并使用一个名字命名&#xff0c;并通过编号的方式对这些数据进行统一管理。 ①数组本身是引用数据类型&#xff0c;而数组中的元素可以是任何数据类型&#xff0c;包括基本数据类型和引用数据类型。…

css hack技巧_5种减少Hack的编码技巧

css hack技巧在本文中&#xff0c;我们将探讨五种方法&#xff0c;这些方法可以使用有效的编码来帮助垃圾回收器花费更少的CPU时间分配和释放内存&#xff0c;并减少GC开销。 较长的GC通常会导致我们的代码在回收内存时停止&#xff08;也称为“停止世界”&#xff09;。 一些…

mysql数据库全备_MySQL innobackupex全备是指什么

MySQL innobackupex全备是指什么发布时间&#xff1a;2020-06-03 10:10:31来源&#xff1a;51CTO阅读&#xff1a;133作者&#xff1a;三月下文主要给大家带来MySQL innobackupex全备是指什么&#xff0c;希望这些内容能够带给大家实际用处&#xff0c;这也是我编辑MySQL innob…

数组初始化使用(写)new与不使用(不写)new

首先&#xff0c;数组初始化时&#xff0c;写不写new没有区别的。int arr[] new int[]{ 3, 9, 8};或者int[] arr {3,9,8};编译器遇到 int a[] {3, 8, 9}; 会编译成和 int a[] new int[] {3, 8, 9}; 完全一样的中间代码。 ①不同于String类。String由于实现了常量池&#xf…

如何更改Spring Boot应用程序的默认端口

默认情况下&#xff0c;Spring Boot应用程序通过端口8080在嵌入式Tomcat上运行。为了更改默认端口&#xff0c;您只需要修改server.port属性&#xff0c;该属性将在运行时由Spring Boot应用程序自动读取。 在本教程中&#xff0c;我们提供了修改server.port属性的常用方法。 …

Java数组(2)--一维数组

一、一维数组的&#xff08;声明赋值&#xff09;初始化 声明&#xff1a;type var[]; 或 type[] var;&#xff08;示例&#xff1a;int[] age;&#xff09; 初始化&#xff1a; ①动态初始化&#xff1a;声明且为数组元素分配空间&#xff0c;与赋值的操作分开进行 int[] ar…

python函数理解_Python 知识理解---函数

函数就如小程序&#xff0c;是组织好的&#xff0c;可以重复使用的&#xff0c;用来实现某一功能的代码.例&#xff1a;print(),input(),len()...等。一般来说函数都带个括号(),在括号里放的是参数&#xff0c;参数指向的是函数要处理的数据。print(python),括号里面的是print(…

JSON合并补丁:JSON-P 1.1概述系列

Java EE 8包括对JSON处理API的更新&#xff0c;并使其与JSON的最新IEFT标准保持同步。 他们是&#xff1a; JSON指针 RFC 6901 JSON补丁 RFC 6902 JSON合并修补程序 RFC 7396 我将在这个迷你系列中涵盖这些主题。 入门 要开始使用JSON-P&#xff0c;您将需要Maven中央存储…

Java数组(3)--二维(多维)数组

二维数组相当于一维数组的元素是一维数组 一、二维数组声明赋值初始化 动态初始化① int[][] arr new int[3][2];定义了名称为arr的二维数组 二维数组中有3个一维数组 每一个一维数组中有2个元素 一维数组的名称分别为arr[0], arr[1], arr[2] 给第一个一维数组1脚标位赋值为…

workflow java_workflow java实现的activity工作流实例 Develop 238万源代码下载- www.pudn.com...

文件名称: workflow下载收藏√ [5 4 3 2 1 ]开发工具: Java文件大小: 134 KB上传时间: 2014-09-18下载次数: 3提 供 者: 张华详细说明&#xff1a;java实现的activity工作流实例 -java activity文件列表(点击判断是否您需要的文件&#xff0c;如果是垃圾请在下面评价投诉)…

使用OAuth 2 / OpenID Connect的SSO的Spring Boot 2本机方法

这篇文章是3篇系列文章的最后一部分&#xff0c;该系列文章探讨了如何为基于Spring Boot 2的应用程序启用OAuth2提供程序SSO。 3个帖子是&#xff1a; 引导兼容OpenID Connect的OAuth2授权服务器/ OpenID提供程序的方法 与OAuth2授权服务器/ OpenID提供程序集成的旧版Spring …