我的目标是使用 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 编写的,并自动生成所需的输出:整数是不带小数点的。)