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

news2024/11/13 21:40:35

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.coloradmin.cn/o/2144477.html

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

相关文章

为什么制造业要上MES,有哪些不得不上的理由吗?

关于为什么制造业要上MES&#xff0c;以及有哪些不得不上的理由吗&#xff1f;以下分为三个部分给大家详细讲解。 一、MES是什么&#xff1f; MES是一个综合性系统&#xff0c;连接企业的ERP系统与生产现场操作层面。它通过实时数据采集、分析和监控&#xff0c;将计划与执行紧…

精准营销,高效获客:Xinstall如何为App增长赋能?

在移动互联网时代&#xff0c;App的推广和运营面临着前所未有的挑战。如何在海量用户中精准定位目标客户&#xff1f;如何实时追踪用户行为&#xff0c;优化推广策略&#xff1f;Xinstall作为一站式App全渠道统计服务商&#xff0c;以全渠道数据统计为核心&#xff0c;为App运营…

继承1 2024_9_18

1.继承的基本用法 当需要继承的时候,我们就在派生类的后面加上一个权限父类,这个权限可以是公有,保护和私有,后面就是继承的父类.此时,下面的stu这个派生类,也就可以使用Person里面的方法了. 2.继承基类成员访问方式的变化 当父类被继承到派生类的时候,此时会根据继承方式的不…

Qt 学习第十天:小项目:QListWidget的使用

一、页面布局 二、命名按钮 双击按钮可以修改显示中的文字&#xff08;例如&#xff1a;改成“全选”&#xff09;&#xff0c;objectName是要改成程序员所熟悉的名字&#xff08;英文&#xff0c;符合代码规范&#xff09;方便修改和书写代码&#xff0c;一看就能看懂的 三、…

亚马逊、沃尔玛、敦煌网、Target塔吉特、Temu环境搭建测评技术!

海外跨境电商各大主要平台正不断力推半托管模式&#xff0c;不断对商家开出众多吸引和扶持政策。全托管是指电商平台全面负责店铺的运营&#xff0c;包括仓储、配送、售后等&#xff0c;而商家主要负责提供货品。半托管模式则基本由商家自主经营&#xff0c;平台只负责仓配物流…

Xilinx系FPGA学习笔记(九)DDR3学习

系列文章目录 文章目录 系列文章目录前言DDR介绍DDR的IP核学习接口信号解析读写流程分析AXI 前言 这里暂时先只介绍一下IP核配置生成和一些接口信号的含义&#xff0c;后续还需要补很多知识点和实际测试应用 DDR介绍 DDR3 已不是当今主流的 DDR 存储器&#xff0c;市场上的 …

双天线+ins

使用1&#xff1a; 1、初始v-b 双天线与车固连且平行&#xff0c;双天线的欧拉角得到Cvn, Cnb组合得到&#xff0c;车体与INS之间不平行存在Cvb, 用Cnb*Cvn 得到Cvb initmisali(opt,solbuf,posebuf,ts,te,Cvb)) { 存疑的地方&#xff1a;att 应该清空后再用 否则变成了(A…

TMStarget学习——T1 Segmentation数据处理及解bug

最新学习季公俊老师的神器 TMStarget 的第一个模块基于结构像的靶区计算T1 segmentation。下面上步骤&#xff1a; (1)在github 上下载 TMStarget https://github.com/jigongjun/Neuroimaging-and-Neuromodulation (2)按照要求下载依赖工具软件AFQ、vistasoft、SPM12 &#…

GBase8c主备版500升级步骤

# 升级方式区别 就地升级&#xff1a;升级期间需停止业务进行&#xff0c;一次性升级所有节点。 灰度升级&#xff1a;灰度升级支持全业务操作&#xff0c;也是一次性升级所有节点。 指定节点升级&#xff1a;基于灰度升级&#xff0c;支持升级指定节点&#xff0c;支持部分…

【练习11】大数乘法

链接&#xff1a;大数乘法__牛客网 (nowcoder.com) 算法分析&#xff1a; 1.为什么以字符串的形式输入&#xff1f; 因为读入的数字太大&#xff0c;而字符串没有固定的大小限制。 2.可以采用模拟列竖式做乘法的方式&#xff0c;先无进位相乘再相加&#xff0c;最后处理进位。 …

Java智慧云智能教育平台

技术架构&#xff1a; SpringBoot Mybatis Shiro mysql redis 功能描述&#xff1a; 支持多种题型&#xff1a;选择题、多选题、判断题、填空题、综合题以及数学公式。支持在线考试&#xff0c;教师在线批改试卷。 功能模块&#xff1a;系统首页、教育教学模块、考试管…

第十一章 【后端】商品分类管理微服务(11.3)——商品管理模块 yumi-etms-goods

11.3 商品管理模块 yumi-etms-goods 新建 yumi-etms-goods 模块 添加依赖 pom.xml <?xml version="1.0" encoding="UTF-8"?> <project xmlns&#

干货满满!第二期流程挖掘实践训练营圆满落幕~

2023年7月14日&#xff0c;望繁信科技第二期流程挖掘实践训练营在上海圆满结束&#xff01;此次训练营以实战为导向&#xff0c;为大家提供了一个深入学习流程挖掘知识和技巧的专业交流平台&#xff0c;得到了广大学员们的一致好评。 产品大咖面对面 作为本次训练营的亮点环节…

一次渲染十万条数据:前端技术优化(上)

今天看了一篇文章&#xff0c;写的是一次性渲染十万条数据的方法&#xff0c;本文内容是对这篇文章的学习总结&#xff0c;以及知识点补充。 在现代Web应用中&#xff0c;前端经常需要处理大量的数据展示&#xff0c;例如用户评论、商品列表等。直接渲染大量数据会导致浏览器性…

PMP出成绩非常慢?PDU如何获取?

1、PMP项目管理认证考试后6-8周才公布成绩 2、非一次性发布&#xff0c;从第一个人成绩公布到最后一个公布结束持续一周左右时间 3、PMP每年会考4次&#xff08;3月、5月、8月、11月&#xff09; 4、组织方为美国 5、报名费3900&#xff0c;补考费2500 PMP考试成绩查询方式…

新任项目经理,如何快速接手项目

新任项目经理踏上管理岗位&#xff0c;面临着前所未有的挑战与机遇。如何快速适应角色&#xff0c;有效管理团队&#xff0c;确保项目顺利推进&#xff0c;是每一位新任项目经理必须面对的。 一、深入了解项目与团队 1、项目定位与规划 新任项目经理应对项目进行全面的调研与…

7款实用电脑办公软件和网站,工作效率飞跃提升

4款软件3个网站&#xff0c;电脑里一定要有这7款实用办公工具&#xff0c;提升效率杠杠滴&#xff0c;用过以后就离不开了&#xff01; 1、Free Download Manager 一个免费的下载神器&#xff0c;不仅界面简洁&#xff0c;还没广告。能设置下载计划&#xff0c;多线程下载&am…

让3000年都无人能识的伪二重直线段一下子浮出水面推翻百年集论

黄小宁 公元前1100年中国人商高同周公的一段对话谈到了勾股定理说明人类认识几何学的直线段起码已有3000多年。 直线可由无穷多直线段连接而成。直线段可均匀收缩变短。长为2的长条形弹簧W&#xff08;可二等分&#xff09;被压缩变短成长为1的弹簧b&#xff0c;b不是W的一半。…

yolov8区域入侵检测警报系统-pyside6可视化界面

yolov8区域入侵检测警报系统&#xff0c;是微智启软件工作室基于yolov8目标追踪和pyside6开发&#xff0c;在window的pycharm或者vscode里运行&#xff0c;可以应用于多个领域&#xff0c;检测统计物体个数以及入侵语音警报。 功能介绍 可以应用于 江河流域危险区域禁止游泳警…

C#图像爬虫实战:从Walmart网站下载图片

无论是电子商务网站、社交媒体平台还是新闻门户&#xff0c;图像都扮演着至关重要的角色。对于开发者来说&#xff0c;能够自动化地从这些网站下载图片是一项非常有用的技能。本文将介绍如何使用C#语言和CsQuery库来创建一个图像爬虫&#xff0c;专门用于从Walmart网站下载图片…