Android:使用Gson常见问题(包含解决将Long型转化为科学计数法的问题)

news2024/11/13 9:29:52

一、解决将Long型转化为科学计数法的问题

1.1 场景

将一个对象转为Map类型时,调用Gson.fromJson发现,原来对象中的long类型的personId字段,被解析成了科学计数法,导致请求接口失败,报参数错误。

解决结果图
在这里插入图片描述

1.2、ExampleUnitTest.kt示例代码
data class ReuestParmObj(val personId: Long = 1668394335647, val personType: Int = 1)
class ExampleUnitTest {
    private val mGson: Gson = Gson()

    @Test
    fun gsonReuestParmJson() {
        val reuestParmObj = ReuestParmObj(1668394335647, 1)
        val reuestParmJson: String = mGson.toJson(reuestParmObj)
        println("reuestParmJson信息:$reuestParmJson")
        val mapParm: Map<String, *> =
            mGson.fromJson(reuestParmJson, Map::class.java) as Map<String, *>
        println("mapParms信息:$mapParm")
    }
}

测试结果
在这里插入图片描述

1.3 解决将Long型转化为科学计数法问题的方案

修改gson配置
private val mGson: Gson = GsonBuilder().setLongSerializationPolicy(LongSerializationPolicy.STRING).create()

data class ReuestParmObj(val personId: Long = 1668394335647, val personType: Int = 1)
class ExampleUnitTest {
//    private val mGson: Gson = Gson()
  private val mGson: Gson = GsonBuilder().setLongSerializationPolicy(LongSerializationPolicy.STRING).create()

    @Test
    fun gsonReuestParmJson() {
        val reuestParmObj = ReuestParmObj(1668394335647, 1)
        val reuestParmJson: String = mGson.toJson(reuestParmObj)
        println("reuestParmJson信息:$reuestParmJson")
        val mapParm: Map<String, *> =
            mGson.fromJson(reuestParmJson, Map::class.java) as Map<String, *>
        println("mapParms信息:$mapParm")
    }
}

测试结果
在这里插入图片描述

二、 把null值也转换,默认是不转换null值的

设置:serializeNulls()

 private val mGson: Gson = GsonBuilder().setLongSerializationPolicy(LongSerializationPolicy.STRING).serializeNulls().create()

三、Html的转换

Gson默认是把Html 转义的,但也可以设置不转义。
设置:disableHtmlEscaping()

class ExampleUnitTest {
	@Test
    fun testDisableHtmlEscaping(){
        val gson1: Gson = Gson()
        val gson2: Gson = GsonBuilder().disableHtmlEscaping().create()
        val htmlStr = "<h3>测试disableHtmlEscaping</h3>"
        println("未设置disableHtmlEscaping转换htmlStr结果:${gson1.toJson(htmlStr)}")
        println("设置disableHtmlEscaping转换htmlStr结果:${gson2.toJson(htmlStr)}")
    }
}

测试结果
在这里插入图片描述

四、设置输入json格式

默认的输出是compact格式,示例
{"personId":1668394335647,"personType":1}
设置:setPrettyPrinting()

class ExampleUnitTest {
	 @Test
    fun testSetPrettyPrinting(){
        val gson1: Gson = Gson()
        val gson2: Gson = GsonBuilder().setLongSerializationPolicy(LongSerializationPolicy.STRING).setPrettyPrinting().create()
        val reuestParmObj = ReuestParmObj(1668394335647, 1)
        println("未设置 setPrettyPrinting 转换reuestParmObj结果:${gson1.toJson(reuestParmObj)}")
        println("设置 setPrettyPrinting 转换reuestParmObj结果:${gson2.toJson(reuestParmObj)}")
    }
}

测试结果
在这里插入图片描述

五、ExampleUnitTest.kt文件完整代码

import com.google.gson.Gson
import com.google.gson.GsonBuilder
import com.google.gson.LongSerializationPolicy
import com.google.gson.reflect.TypeToken
import org.junit.Test

/**
 * Example local unit test, which will execute on the development machine (host).
 *
 * See [testing documentation](http://d.android.com/tools/testing).
 */

data class ReuestParmObj(val personId: Long = 1668394335647, val personType: Int = 1)
class ExampleUnitTest {
    private val mGson1: Gson = Gson()
    private val mGson2: Gson =
        GsonBuilder().setLongSerializationPolicy(LongSerializationPolicy.STRING).serializeNulls()
            .disableHtmlEscaping().create()

    @Test
    fun gsonReuestParmJson() {
        val reuestParmObj = ReuestParmObj(1668394335647, 1)
        val reuestParmJson1: String = mGson1.toJson(reuestParmObj)
        val reuestParmJson2: String = mGson2.toJson(reuestParmObj)
        println("reuestParmJson1 信息:$reuestParmJson1")
        println("reuestParmJson2 信息:$reuestParmJson2")

        //        val type = object : TypeToken<Map<String, *>>() {}.type
//        val mapParm: Map<String, *> = mGson1.fromJson(reuestParmJson, type)

        val mapParm1: Map<String, *> =
            mGson1.fromJson(reuestParmJson1, Map::class.java) as Map<String, *>
        println("mapParm1 信息:$mapParm1")
        val mapParm2: Map<String, *> =
            mGson2.fromJson(reuestParmJson2, Map::class.java) as Map<String, *>
        println("mapParms2 信息:$mapParm2")
        /*
            reuestParmJson1 信息:{"personId":1668394335647,"personType":1}
            reuestParmJson2 信息:{"personId":"1668394335647","personType":1}
            mapParm1 信息:{personId=1.668394335647E12, personType=1.0}
            mapParms2 信息:{personId=1668394335647, personType=1.0}
         */

    }

    @Test
    fun testDisableHtmlEscaping() {
        val gson1: Gson = Gson()
        val gson2: Gson = GsonBuilder().disableHtmlEscaping().create()
        val htmlStr = "<h3>测试disableHtmlEscaping</h3>"
        println("未设置disableHtmlEscaping转换htmlStr结果:${gson1.toJson(htmlStr)}")
        println("设置disableHtmlEscaping转换htmlStr结果:${gson2.toJson(htmlStr)}")
        /*
            未设置disableHtmlEscaping转换htmlStr结果:"\u003ch3\u003e测试disableHtmlEscaping\u003c/h3\u003e"
            设置disableHtmlEscaping转换htmlStr结果:"<h3>测试disableHtmlEscaping</h3>"
         */
    }

    @Test
    fun testSetPrettyPrinting() {
        val gson1: Gson = Gson()
        val gson2: Gson = GsonBuilder().setLongSerializationPolicy(LongSerializationPolicy.STRING)
            .setPrettyPrinting().create()
        val reuestParmObj = ReuestParmObj(1668394335647, 1)
        println("未设置 setPrettyPrinting 转换reuestParmObj结果:${gson1.toJson(reuestParmObj)}")
        println("设置 setPrettyPrinting 转换reuestParmObj结果:${gson2.toJson(reuestParmObj)}")
        /*
           未设置 setPrettyPrinting 转换reuestParmObj结果:{"personId":1668394335647,"personType":1}
           设置 setPrettyPrinting 转换reuestParmObj结果:{
             "personId": "1668394335647",
             "personType": 1
           }
        */
    }
}

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

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

相关文章

轻松掌握域名系统(DNS):基础小白的入门指南

文章目录 域名系统概述DNS 的发展和结构DNS 的服务和功能互联网的域名结构域名服务器的类型和功能域名解析的过程DNS资源记录小结 域名系统概述 域名系统&#xff08;Domain Name System&#xff0c;DNS&#xff09; 是一种核心服务&#xff0c;它使得网络应用能够在应用层使用…

腾讯地图SDK Android版开发 6 显示覆盖物

腾讯地图SDK Android版开发 6 显示覆盖物 前言地图类中覆盖物的接口覆盖物类Marker示例Polyline示例Polygon示例Arc示例Circle示例移除示例效果图 Marker的更多属性常用属性交互碰撞动画其它属性 折线的更多属性常用属性交互其它属性 多边形的更多属性常用属性交互其它属性 Arc…

【手抖拜拜!特发性震颤患者的专属锻炼秘籍,轻松改善生活品质】

Hey小伙伴们~&#x1f44b; 今天咱们来聊聊一个可能不那么常被提及&#xff0c;但却实实在在影响着很多人生活质量的话题——特发性震颤。如果你或你身边的人正为此困扰&#xff0c;别怕&#xff0c;这篇笔记就是你们的“稳手宝典”&#x1f4da;&#xff01; &#x1f308; 了…

【论文复现】 | 改善抑郁估计从面部对齐,训练优化和调度

文章目录 1、Introduction2、Related work3、 Proposed methodology3.1. Preprocessing and face alignment3.2 Architecture3.3 Data Augmentation3.4 Training 4、Experimental analysis and results4.1 Datasets4.2 Experimental setup4.3 Protocol and Performance metrice…

JS面试题3

1、使用递归完成1~100的累加 // 1~100累加function addRes(x,y){if(x y){return x}else{return y addRes(x,y-1) // 第一次&#xff1a;3 addRes(1,2) > 往后依次递减&#xff0c;到达目标值位置后依次计算累加值}}console.log(addRes(1,3))// 斐波那契数列(兔子数列) &…

【HTML5+JavaScript+CSS3】3D空间环绕旋转特效(效果+源码+可理解的注释)

失去一个人,只是生命中的一段过程,天空不会永远都下雨,我们总会在最深的绝望里,看见最美的风景。 🎯作者主页: 追光者♂🔥 🌸个人简介: 💖[1] 计算机专业硕士研究生💖 🌿[2] 2023年城市之星领跑者TOP1(哈尔滨)🌿 🌟[3] 2022年度博客之星人…

案例研究|JumpServer堡垒机为金山办公信息安全保驾护航

金山办公&#xff08;KINGSOFT OFFICE&#xff09;是中国办公软件的领航者&#xff0c;其产品体系以旗舰产品WPS Office为核心&#xff0c;辅以金山文档、金山协作及金山词霸等产品&#xff0c;形成了全方位、高效能的办公生态系统&#xff0c;在中国乃至全球范围内拥有庞大的用…

项目问题 | CentOS 7停止维护导致yum失效的解决办法

目录 centos停止维护意味着yum相关源伴随失效。 报错&#xff1a; 解决方案&#xff1a;将图中四个文件替换掉/etc/yum.repos.d/目录下同名文件 资源提交在博客头部&#xff0c;博客结尾也提供文件源码内容 CentOS-Base.repo CentOS-SCLo-scl.repo CentOS-SCLo-scl-rh.rep…

云计算实训30——自动化运维(ansible)

自动化运维 ansible----自动化运维工具 特点&#xff1a; 部署简单&#xff0c;使用ssh管理 管理端与被管理端不需要启动服务 配置简单、功能强大&#xff0c;扩展性强 一、ansible环境搭建 准备四台机器 安装步骤 mo服务器&#xff1a; #下载epel [rootmo ~]# yum -y i…

mysql数据库连接时区设置UTC的坑?serverTimezone=UTC是什么意思?

Mysql数据库连接&#xff0c;设置时区为UTC的坑&#xff1a; UTC是世界统一时间&#xff0c;也就是世界协调时间&#xff08;UTC&#xff09;/格林尼治时间。比北京时间快8小时。 导致的问题&#xff1a;数据库连接时区设置为UTC之后&#xff0c;数据库里面的数据和系统里面的时…

计算机毕业设计PyHive+PySpark深圳共享单车预测系统 共享单车数据分析可视化大屏 共享单车爬虫 共享单车数据仓库 机器学习 深度学习 Hadoop

题目&#xff1a; 基于hadoop的共享单车布局规划 1. 论文选题的意义 共享单车是一个近年来很热门的新兴事物&#xff0c; 共享经济在我国发展迅速&#xff0c;收到了政府和广大民众的重大关注&#xff0c;而出现的很多问题也引起了众多学者的注意&#xff0c;关于共享单车的研…

【题解】—— LeetCode一周小结32

&#x1f31f;欢迎来到 我的博客 —— 探索技术的无限可能&#xff01; &#x1f31f;博客的简介&#xff08;文章目录&#xff09; 【题解】—— 每日一道题目栏 上接&#xff1a;【题解】—— LeetCode一周小结31 5.不含连续1的非负整数 题目链接&#xff1a;600. 不含连续…

Idea2024创建Meavn项目

因为现在Idea创建Meavn项目&#xff0c;文件夹下面是光秃秃的&#xff0c;没有默认文件&#xff0c;这里笔者用简单易懂的方式给大家创建一个带文件夹的项目 1. new -> project | 填写基本信息 2. 设置maven坐标 点击Add > Create 创建的文件没有任何结构 src.main.java…

一个集成物联网、机器学习和大数据实践平台在电气工程课程中的应用

整理自《A Platform for Integrating Internet of Things, Machine Learning, and Big Data Practicum in Electrical Engineering Curricula》&#xff0c;由Nandana Jayachandran、Atef Abdrabou、Naod Yamane和Anwer Al-Dulaimi共同撰写&#xff0c;发表于2024年的《Compute…

【python数据分析05】——matplotlib绘图基础语法

matplotlib绘图基础语法 前言1 pyplot基础语法1.1 创建画布与创建子图1.2 添加画布内容1.3 保存与显示图形1.4 设置pyplot的动态rc参数 前言 matplotlib中应用最广的是matplotlib.pyplot模块&#xff0c;这个模块是一个命令风格函数的集合。 1 pyplot基础语法 大部分pyplot图…

Python文件管理器:一个基于wxPython的桌面应用

在当今的软件开发世界中&#xff0c;管理大量的源代码文件变得越来越重要。无论是个人项目还是大型团队协作&#xff0c;有一个强大而灵活的文件管理工具都可以大大提高工作效率。今天&#xff0c;我们要介绍一个基于Python和wxPython构建的文件管理器&#xff0c;它专门用于管…

GNS3 IOU: License section not found in iourc file /tmp/tmpj54abrhf/iourc

现象&#xff1a; License section not found in iourc file /tmp/tmpj54abrhf/iourc 解决方案&#xff1a; IOU 证书&#xff1a;&#xff08;直接复制进去即可&#xff09; [license] gns3-iouvm cd11acbc599f2364; gns3vm 73635fd3b0a13ad0;

记一个坑android Studio:Can‘t bind to local -1 for debugger

AndroidStudio 可编译,安装,设置管理 现象: 唯独 attach 或者调试时报错 Cant bind to local -1 for debugger 控制台日志: 2024-08-15 10:41:59,645 [ 9927] WARN - #com.android.ddmlib - * daemon not running; starting now at tcp:5037 2024-08-15 10:…

DRISSIONPAGE获取图书的封面并保存到本地

一、页面自动截图 二、最终结果 三、代码实现 from DrissionPage import ChromiumPage,ChromiumOptions co =ChromiumOptions().set_paths(browser_path=r"C:\Users\lenovo\AppData\Local\Google\Chrome\Application\chrome.exe") #这里指定浏览器 注意ChromiumOp…

【Oracle篇】统计信息和动态采样的深度剖析(第一篇,总共六篇)

&#x1f4ab;《博主介绍》&#xff1a;✨又是一天没白过&#xff0c;我是奈斯&#xff0c;DBA一名✨ &#x1f4ab;《擅长领域》&#xff1a;✌️擅长Oracle、MySQL、SQLserver、阿里云AnalyticDB for MySQL(分布式数据仓库)、Linux&#xff0c;也在扩展大数据方向的知识面✌️…