如何在使用moshi进行反序列化时区分长和双值?
问题描述:
我的目标是通过使用JSON格式来同步abitrary行数据。 由于我不知道行的确切方案(这是一种通用同步方法),我的数据模型显然必须依赖“对象”。所以在Java中,我将有一个Map<String,Object>
的数组与服务器同步。如何在使用moshi进行反序列化时区分长和双值?
翻译这样的行成JSON会看到这样的
{{"string":"stringvalue"},{"double1":1234.567},{"double2":1234.0},{"long":1234}}
到目前为止,一切都很好 - 没有问题莫希 - 一切正常。
现在的问题:当我尝试用moshi反序列化那个JSON时,我得到了“long”成员的double值。 Moshi将所有数字转换为双精度。但不幸的是,并非所有数字都可以安全地转换为双打。非常大的整数(aka longs)在双精度的有限精度上存在问题。四舍五入效应也可能存在。
我开了一个问题与莫西,但不幸的是,已关闭。也许我还不够清楚。 (Issue 192)
JSON没有整数的概念 - 只有数字和字符串。但从上面的示例中的“double2”的细微的细节可能会导致我的问题的解决方案:
如果一个数字不包含小数点,它是一个整数,应该转换为长整数。由于longs不能无损地转换为double,所以我需要一个方法在值转换为double之前拦截解析器。但如何做到这一点?
莫希具有JsonAdapters的这个方便的概念 - 但不幸的是我目前不知道怎样才能在这种情况下使用它们:
输入型的这样一个JsonAdapter必须是对象,因为我不能投了产生翻番。所以我必须在转换任何值之前拦截解析器。
但是如何从那里返回多个类型? (我必须从那里返回字符串,双精度或长度 - 或者如果我可以将输入限制为仅数字,我将至少必须返回长整数或双精度。)
(我的后端是用PHP编写的并自动生成所需的输出:整数被写入没有小数点。)