我的目标是使用 JSON 格式同步任意行数据。由于我不知道行的确切方案(这是一种通用同步方法),因此我的数据模型显然必须依赖于“对象”。Map<String,Object>所以在Java中我将有一个与服务器同步的数组。
将这样的行转换为 JSON 会得到类似的结果
{{"string":"stringvalue"},{"double1":1234.567},{"double2":1234.0},{"long":1234}}
Run Code Online (Sandbox Code Playgroud)
到目前为止,一切都很好 - moshi 没有问题 - 一切都按预期进行。
现在的问题是:当我尝试使用 moshi 反序列化该 JSON 时,我得到“long”成员的双值。Moshi 将所有数字转换为双精度数。但不幸的是,并非所有数字都可以安全地转换为双精度数。非常大的整数(又名长整数)存在双精度数有限精度的问题。并且舍入效应也可能存在。
我向 moshi 提出了一个问题,但不幸的是该问题已关闭。也许是我表达得不够清楚。(第192期)
JSON 没有整数的概念 - 只有数字和字符串。但是上面示例中的“double2”的微妙细节可能会导致我的问题的解决方案:
如果一个数字不包含小数点,那么它是一个整数,应该转换为长整型。
由于长整型无法无损转换为双精度,因此我需要一种方法在将值转换为双精度之前拦截解析器。但如何做到这一点呢?
Moshi 有 JsonAdapters 这个方便的概念 - 但不幸的是,我目前不知道如何在这种情况下使用它们:
这样的 JsonAdapter 的输入类型必须是 Object,因为我无法将生成的 double 转换为 long。所以我必须在解析器转换任何值之前拦截它。
但是如何从那里返回不止一种类型呢?(我必须从那里返回 String、Double 或 Long - 或者如果我可以将输入限制为仅数字,我至少必须返回 Long 或 Double。)
(我的后端是用 PHP 编写的,并自动生成所需的输出:整数不带小数点。)
不久前,我使用ProviderTestCase2创建了一些检测测试。现在,我想更新我的代码库,并尝试在当前环境中重新激活旧的测试。
1)当我更新为compileSdkVersion 28时,似乎不再有任何类ProviderTestCase2。清理和构建项目失败。如果我回到版本27,则可以成功构建该项目。
2)我有一种特殊情况,我想用一组测试来测试对象的不同变体。因此,我决定利用继承并将测试放在基类中,配置要由超类测试的对象。这过去曾经奏效。(是的,我知道关于测试中的继承是不好的观点,但是在这种情况下,它是可以的;-))
现在不执行任何测试。Android Studio抱怨说有一个空的测试套件。
也有警告,我在扩展JUnit3的类中使用JUnit4注释进行了测试。我不记得我曾经看过这些警告。
这是Android库中的错误吗?或在哪里可以找到解决此问题的提示?
(使用Android Studio 3.2和最新的库)