6

我的目标是使用 JSON 格式同步任意行数据。由于我不知道行的确切方案(这是一种通用同步方法),我的数据模型显然必须依赖“对象”。Map<String,Object>因此,在 Java 中,我将有一个与服务器同步的数组。

将这样的一行翻译成 JSON 会给出类似的结果

{{"string":"stringvalue"},{"double1":1234.567},{"double2":1234.0},{"long":1234}}

到目前为止,一切都很好 - moshi 没问题 - 一切都按预期工作。

现在的问题:当我尝试用 moshi 反序列化 JSON 时,我得到了一个“long”成员的双值。Moshi 将所有数字转换为双精度数。但不幸的是,并非所有数字都可以安全地转换为双精度数。非常大的整数(又名 long)存在双精度有限的问题。并且可能存在舍入效应。

我打开了一个关于 moshi 的问题,但不幸的是它被关闭了。也许我不够清楚。(第 192 期

JSON 没有整数的概念——只有数字和字符串。但是上面示例中“double2”的细微细节可能会导致我的问题的解决方案:
如果一个数字不包含小数点,它是一个整数,应该转换为一个长整数。

由于 longs 不能无损地转换为 double,我需要一种方法在将值转换为 double 之前拦截解析器。但是怎么做呢?

Moshi 有这个方便的 JsonAdapter 概念——但不幸的是,我目前不知道如何在这种情况下使用它们:
这种 JsonAdapter 的输入类型必须是 Object,因为我不能将生成的 double 转换为 long。所以我必须在解析器转换任何值之前拦截它。
但是如何从那里返回一种以上的类型呢?(我必须从那里返回 String、Double 或 Long - 或者如果我可以将输入限制为只有数字,我至少必须返回 Longs 或 Doubles。)

(我的后端是用 PHP 编写的,并自动生成所需的输出:整数是不带小数点的。)

4

1 回答 1

3

恐怕不更改 Moshi 源代码是不可能的。JSON 字符串源通过JsonReader将所有数字转换为双精度数。我找不到改变这种行为的方法,因为所有子类都受包保护。

于 2017-04-16T09:20:44.747 回答