当前位置: 首页 > 知识库问答 >
问题:

为什么Moshi把整数解析为double?

池宸
2023-03-14

我试图使用Moshi+Kotlin解析一个设计得不是很好的API的json。出于某些原因,它将像71这样的数字解析为double。

第三方api有一个对象列表,可以类似于:{“foo”:[[1234567000,12]]}//long,int或{“foo”:[[1234567000,“string”,0,2]]}//long,string,int,int

由于第三方api,我有以下kotlin类:

@JsonClass(generateAdapter = true)
class D {
    var foo: List<Any> // I use Any because it can be either String or Int or Long
}
val moshi = Moshi.Builder().build()
val adapter = moshi.adapter(D::class.java)
var D d = adapter.fromJson("{\"foo\":[[1234567000,\"string\",0,2]]}")
var index = d.foo[2]
var value : Long = 0
// here I get an error: ClassCastException: java.lang.Double cannot be cast to java.lang.Long
value = d.foo[index]

但是出于某种原因,Moshi将json字符串中的整数转换为Doubles而不是Int或long。我怎么能修好它?

共有1个答案

厍晋鹏
2023-03-14

任何JSON解析库背后的基本思想都是将JSON解析为特定的类型,如果该类型具有integer类型的属性,那么解析库将尝试将JSON number类型转换为integer,但您正在将JSON解析为any,这实际上告诉moshi猜测对象的类型。

因为 ;JSON不区分整数和浮点字段,所以当解析为any时,Moshi默认为Float/Double。

这里的问题在API中,它不应该为同一个查询返回不同的类型值。至少应该有一个关于数据类型的指示。如果收到一个实际上看起来像数字的字符串值,会发生什么?

 类似资料:
  • 可能只是我用错了,因为我对Kotlin和Moshi是新的。 为什么fromJson是null并且需要一个!!还是?。例如: 如果解析失败,缺少一个必需的字段,在我的例子中,它只会抛出一个异常。那么它如何解析一个“无效”的JSON响应而不失败,即返回null呢?

  • 问题内容: 我到处都读到过,当您在Java中定义介于-128到127之间的Integer时,它不会创建新对象,而是返回已经创建的对象。 除了让新手程序员比较Integer对象以查看它们是否具有相同的数字外,我看不到这样做的任何意义,但是我认为这很糟糕,因为确保他们认为可以将任何Integer对象与进行比较,并且还在教学在任何编程语言中都不好的做法:将两个“不同”对象的内容与进行比较。 这样做有其他

  • 除了让新手程序员将整数对象与进行比较,以确定它们是否是相同的数字之外,我认为这样做没有什么意义,但我认为这是不好的,因为他们肯定认为可以将任何整数与进行比较,而且在任何编程语言中都教给了一种不好的做法:用比较两个“不同”对象的内容。 为什么这样做还有其他原因吗?或者这只是在设计语言时的一个错误决定(在我看来),就像JavaScript中的可选分号一样? 编辑:我在这里看到他们解释了行为:为什么整数

  • 问题内容: 任何数据类型的上限(不包括)总是比下限的绝对值小1。 例如,an的上限为2,147,483,647,ABS(下限)= 2,147,483,648。 是否有理由总是总是比负整数多一个负整数? 编辑:更改,因为问题与数据库不直接相关 问题答案: 您提供的类型是有符号整数。让我们来看一个字节(8位)的示例。使用1字节,您可以使用组合来存储256个可能的数字。 现在,您要具有相同数量的正数和负

  • 类无法解析,为什么?这就引出了一个问题:在哪里可以找到的javadoc? null

  • 问题内容: 我在文件中有此JSON: 我编写了以下脚本来打印所有JSON数据: 但是,该程序会引发异常: 如何解析JSON并提取其值? 问题答案: 您的数据不是有效的JSON格式。您有什么时候应该拥有: 用于JSON数组,在Python 中称为 用于JSON对象(在Python 中称为JSON对象) JSON文件的外观如下: 然后,您可以使用您的代码: 有了数据,您现在还可以找到类似的值: 试试看