使用moshi进行反序列化时如何区分长值和双值?

时间:2016-09-23 10:06:19

标签: java json moshi

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

将这样的行转换为JSON会产生类似

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

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

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

我向moshi提出了一个问题,但遗憾的是已经关闭了。也许我不够清楚。 (Issue 192

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

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

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

(我的后端用PHP编写并自动生成所需的输出:整数写入时没有小数点。)

1 个答案:

答案 0 :(得分:1)

我担心如果不改变Moshi源代码就不可能。 JSON字符串源通过JsonReader,将所有数字转换为double。我找不到如何改变这种行为的方法,因为所有子类都是受包保护的。