首页 > 其他分享 >android gson 扩展, 序列化int类型被转double 问题

android gson 扩展, 序列化int类型被转double 问题

时间:2024-06-05 11:44:35浏览次数:19  
标签:google bigDecimal int double fun import 序列化 com gson

import com.google.gson.Gson
import com.google.gson.GsonBuilder
import com.google.gson.ToNumberStrategy
import com.google.gson.reflect.TypeToken
import com.google.gson.stream.JsonReader
import java.io.IOException
import java.lang.reflect.Type
import java.math.BigDecimal;

val gson: Gson = GsonBuilder()
.setObjectToNumberStrategy(AutoToNumberStrategy())
.create()

fun Gson.safetyToJson(any: Any) = try {
gson.toJson(any)
} catch (e: Exception) {
if (BuildConfig.DEBUG) {
e.printStackTrace()
}
null
}

fun Any?.safetyToJson() = try {
gson.toJson(this)
} catch (e: Exception) {
if (BuildConfig.DEBUG) {
e.printStackTrace()
}
null
}

inline fun String?.safetyToClass(cls: Class): T? = try {
gson.fromJson(this, cls)
} catch (e: Exception) {
if (BuildConfig.DEBUG) {
e.printStackTrace()
}
null
}

inline fun String?.safetyToClass(typeOf: Type = object : TypeToken() {}.type): T? =
try {
gson.fromJson(this, typeOf) as? T
} catch (e: Exception) {
if (BuildConfig.DEBUG) {
e.printStackTrace()
}
null
}

/**

  • author : Android 轮子哥
  • github : https://github.com/getActivity/GsonFactory
  • time : 2024/03/11
  • desc : 自动转换数值类型的策略
    */
    class AutoToNumberStrategy : ToNumberStrategy {
    @Throws(IOException::class)
    override fun readNumber(in: JsonReader): Number {
    // Github issue 地址:https://github.com/getActivity/GsonFactory/issues/40
    val numberString = in.nextString()
    val bigDecimal = BigDecimal(numberString)
    // 判断这个数值是浮点数还是整数
    if (bigDecimal.scale() > 0) {
    // 如果是浮点数,则用 double 类型装载
    return bigDecimal.toDouble()
    }
    // 如果是整数,则用 int 类型或者 long 类型装载
    return if (bigDecimal > BigDecimal.valueOf(Int.MAX_VALUE.toLong())) {
    bigDecimal.toLong()
    } else {
    bigDecimal.toInt()
    }
    }
    }

标签:google,bigDecimal,int,double,fun,import,序列化,com,gson
From: https://www.cnblogs.com/lizhanqi/p/18232698

相关文章

  • printf() 格式字符串的使用方法
    printf()是C语言中一个非常重要的函数,它的核心功能是打印格式化的字符串。而其中的关键则是第一个参数——格式字符串(formatstring)。虽然大多数人都会使用格式字符串,但一些细节可能未必了解。本文将详细说明格式字符串的使用方法。格式字符串(formatstring)格式字符串是......
  • C语言杂谈:从Hello world说起 #include| main| printf| return
    #include<stdio.h>intmain(){ printf("Hellowworld"); return0;}        打印出“Helloworld”的这个程序相信每个人都是见过的,这段代码非常的简单,没有调用函数,没有使用指针,没有各种杂七杂八的东西,但我相信,第一次看见这个代码的朋友一定会有很多疑问。 ......
  • C语言-----计算两个int(32位)整数m和n的二进制表达中,有多少个位(bit)不同?
    intcountBits(intn){intcount=0;while(n){count+=n&1;//count=count+n&1//n&1的结果只可能是1或者0//如果对应的二进制位上的数字不同,那么n&1的结果就是1,//那么count刚好加一n>>=1;......
  • How to use JavaScript BigInt and Number.prototype.toString to handle the super l
    HowtouseJavaScriptBigIntandNumber.prototype.toStringtohandlethesuperlargeintegerproblemsAllInOne如何使用JavaScriptBigInt和Number.prototype.toStringg处理超大整数问题errorsfunctionplusOne(digits:number[]):number[]{letn=parseI......
  • INTJ切记: 太用力的人走不远
    所有的intj都有一个共同点就是焦虑,松弛感对于intj来说基本很少出现不管是在生活中还是工作上,他们都绷得很紧,也许在日常上他们的情绪表现得并不明显,但实际上他们的心理一直是处于痛苦当中的,这种痛苦源于他们对卓越的追求。.不管是世俗的成功,还是心灵高度的升华又或者对......
  • Intensity Segments问题
    https://github.com/zongzw/intensity-segmentIntensitySegments问题,是一个动态规划问题,考察的是对数据结构的掌握程度,从各种不同的数据结构中选择适合问题的的那个。问题到代码的转化能力,如何使用计算机语言描述数据动态变化的过程。以上链接中,使用两种语言golang和javas......
  • 英伟达(NVIDIA)、AMD和Intel部分GPU性能参数对比
    当然,以下是对NVIDIA、AMD和Intel部分GPU型号更为详细的性能参数对比,以及对它们的市场应用和技术创新的概述。NVIDIAGPU1.NVIDIAH100CUDA核心数:数千个(具体数量根据型号配置有所不同)TensorCore数:数百个(为深度学习提供强大的加速能力)显存容量:高达数百GB(如采用HBM2E技术的型......
  • vscode如何添加本地python解释器、解析器 Interpreter?(Python: Select Interpreter),并在
    先安装python扩展然后点ctrl+shift+p搜索python:select,选择解析器(或者也可以直接点左下方的) 然后360报毒了,允许通过,然后选择你想要的解释器  然后就好了20230816文章目录在VSCode中添加本地Python解释器 Python解释器简介为什么要在VSCode中设置Python解释器如......
  • 计算int变量中攸多少bit的值是1
    /*******************************************************************************************************@filename: :CountInt*@brief :*@author :[email protected]*@date :2024/06/03*@version1.0 :V1.0*@prop......
  • 【DRF-10】rest-framework之序列化(数据校验)
    1.自定义classTitleValidator(object):def__init__(self,start):self.start=startdef__call__(self,value):ifnotvalue.startswith(self.start):message='标题必须以%s为开头。'%self.startraiseseria......