当前位置: 首页 > news >正文

解决Gson将长数字( json字符串)转换为科学记数法格式

Gson(又称Google Gson)是Google公司发布的一个开放源代码的Java库,主要用途为序列化Java对象为JSON字符串,或反序列化JSON字符串成Java对象。
在这里插入图片描述

依赖

Gradle:

dependencies {implementation 'com.google.code.gson:gson:2.11.0'
}

Maven:

<dependency><groupId>com.google.code.gson</groupId><artifactId>gson</artifactId><version>2.11.0</version>
</dependency>

我们有的项目中是使用gson解析网络请求返回数据。JSON转Java对象:使用fromJson(String json, Class classOfT)方法将JSON字符串转换为指定的Java对象类型。
代码:

  public static void main(String[] args) {Gson gson = new Gson();String json = "{\"id\":246989989011,\"algItemCode\":\"北京\",\"city\":\"北京\",\"platform\":\"web\"}";
//        Type type = new TypeToken<Response<ReportTwoDto>>() {
//        }.getType();Map jsonString = gson.fromJson(json, Map.class);// 输出JSON字符串System.out.println("Serialized JSON: " + jsonString);}
}

以上代码会出现:
类似:{id=2.46989989011E11, algItemCode=北京, city=北京, platform=web} ID为科学计数法的数据。

Gson为什么使用科学计数法

因为JSON规范中规定,数字必须以十进制格式表示。然而,当一个数字非常大或非常小时,直接使用普通的十进制表示可能会导致精度丢失或者无法表示。为了解决这个问题,JSON规范允许使用科学计数法来表示这些数字。

在Java中,当一个整数超过Integer.MAX_VALUE(2^31-1)时,它会自动转换为Long类型。同样,当一个浮点数超过Float.MAX_VALUE(大约为1.7E308)时,它会自动转换为Double类型。因此,当我们使用Gson将Java对象序列化为JSON字符串时,如果遇到非常大的数字,Gson会将其转换为科学计数法表示的字符串。

问题解决

  1. 转换时指定转换类,不要为map.
public static void main(String[] args) {Gson gson = new Gson();String json = "{\"id\":246989989011,\"algItemCode\":\"北京\",\"city\":\"北京\",\"platform\":\"web\"}";ReportTwoDto jsonString = gson.fromJson(json, ReportTwoDto.class);// 输出JSON字符串System.out.println("Serialized JSON: " + jsonString);}

输出:ReportTwoDto(id=246989989011, algItemCode=北京)

TypeToken是一种用于在Java中解决泛型类型擦除问题的工具,它通过反射机制获取泛型参数的具体类型,从而支持在运行时进行泛型类型的操作。
TypeToken通过匿名内部类的使用来保留泛型信息。具体来说,当创建一个TypeToken实例时,会生成一个匿名内部类,这个匿名类包含了泛型参数的实际类型信息。

public static void main(String[] args) {Gson gson = new Gson();String json = "{\"data\":{\"id\":246989989011,\"algItemCode\":\"北京\",\"city\":\"北京\",\"platform\":\"web\"}}";Type type = new TypeToken<Response<ReportTwoDto>>() {}.getType();Response<ReportTwoDto> jsonString = gson.fromJson(json, type);// 输出JSON字符串System.out.println("Serialized JSON: " + jsonString.data);}

也能输出:
Serialized JSON: ReportTwoDto(id=246989989011, algItemCode=北京)
Gson的TypeToken是一种强大的工具,通过在运行时保留泛型信息,解决了Java泛型类型擦除的问题。它在处理复杂JSON结构和泛型类型时非常有用,广泛应用于各种需要序列化和反序列化的场景中。
2. 使用工具类转换:

public static void main(String[] args) {Gson gson = new Gson();String json = "{\"id\":246989989011,\"algItemCode\":\"北京\",\"city\":\"北京\",\"platform\":\"web\"}";Map jsonString = gson.fromJson(json, Map.class);ReportTwoDto bean = BeanUtil.toBean(jsonString, ReportTwoDto.class);// 输出JSON字符串System.out.println("Serialized JSON: " + bean);}

其他工具替代

如果项目中对数字格式有严格要求,且不能接受科学计数法的表示方式,也可以考虑使用其他序列化工具,如FastJson等,这些工具可能提供了更多的控制选项来满足特定的需求。Gson使用科学计数法主要是出于优化存储空间和提高解析效率的考虑,但在某些情况下,这可能会导致不符合预期的结果。因此,了解如何调整Gson的行为或选择其他工具来满足特定需求是非常重要的。

http://www.lryc.cn/news/443128.html

相关文章:

  • php环境搭建教程
  • 测试ASP.NET Core的WebApi项目调用WebService
  • 【用Java学习数据结构系列】对象的比较(Priority Queue实现的前提)
  • 快手视频怎么保存到相册?(详细操作)
  • 为什么 ECB 模式不安全
  • 『功能项目』事件中心处理怪物死亡【55】
  • 一个安卓鸿蒙化工具
  • PyQt5库学习之QFileDialog.getExistingDirectory函数
  • AUTOSAR_EXP_ARAComAPI的5章笔记(9)
  • 京东-第2题-撞车
  • Vue3流程图插件-Vue Flow
  • 初始网络编程(下)
  • java计算机毕设课设—土地档案管理系统(附源码、文章、相关截图、部署视频)
  • 第4步CentOS配置SSH服务用SSH终端XShell等连接方便文件上传或其它操作
  • Spring:统一结果私有属性造成的前端无法访问异常报错问题
  • thinkphp 做分布式服务+读写分离+分库分表(分区)(后续接着写)
  • webpack的使用
  • MATLAB智能优化算法-学习笔记(3)——大规模邻域搜索算法求解旅行商问题【过程+代码】
  • 货币单位换算 - 华为OD统一考试(E卷)
  • 95、k8s之rancher可视化
  • 简单生活的快乐
  • 【JAVA开源】基于Vue和SpringBoot的在线文档管理系统
  • 大数据新视界 --大数据大厂之数据驱动决策:如何利用大数据提升企业竞争力
  • 【Linux】生产者消费者模型:基于阻塞队列,使用互斥锁和条件变量维护互斥与同步关系
  • 多层感知机paddle
  • linux-网络管理-网络服务管理 17 / 100
  • Docker上安装mysql
  • 【秋招笔试-支持在线评测】8.28华为秋招(已改编)-三语言题解
  • 基于python上门维修预约服务数据分析系统
  • React基础教程(10):React Hooks