【发布时间】:2014-04-02 07:09:18
【问题描述】:
我正在尝试使用我无法控制的 API,该 API 的文档记录不佳且有些不一致。这意味着有时,API 返回的类型与记录的类型或您通常看到的类型不同。对于这个例子,我们将看一个在我通常会看到字符串的地方返回一个数组的情况。这使得 API 很糟糕,但我真正的问题是:我怎样才能更容易地追踪这些东西?现在,错误看起来像这样:
No usable value for identifier
Do not know how to convert JArray(List(JString(3c8723eceb1a), JString(cba8849e7a2f))) into class java.lang.String
在破译问题之后(为什么JValue::toString 不发出 JSON 字符串让我完全感到困惑),当我让我的 case class 只能处理 String 时,我可以弄清楚 API 返回了一个数组s。伟大的。我的问题是发现我的对象模型和 JSON 内容之间的这种差异似乎比它应该做的要困难得多。
目前,这是我查找解码错误的工作流程:
- 希望不良数据有某种识别标记。如果这不是真的,那就是更多的猜测,您将不得不为每个看起来像坏位的条目重复以下步骤。
- 经历将错误消息中的
JArray(List(JString(...), ...))转换为有效 JSON 的麻烦,希望我在 API 端点上以相同的方式对 JSON 进行编码,因为我从中获取了数据。如果这不是真的,那么我使用 JSON 格式化程序 (jq) 以一致地格式化所有数据。 - 在源数据中找到解码错误的来源。
- 回溯数组和对象,以发现我需要如何更改对象模型以更准确地表示从 API 返回给我的数据。
一些背景知识:我来自 C++,为此我推出了自己的 JSON 反序列化框架。使用我构建的库时的等效错误是:
Error decoding value at result.taskInstances[914].subtasks[5].identifier: expected std::string but found array value (["3c8723eceb1a","cba8849e7a2f"]) at 1:4084564
这是我使用手卷库时的过程:
- 将预期类型 (
std::string) 与实际找到的数据 (["3c8723eceb1a","cba8849e7a2f"]) 进行比较,并针对源中数据的路径更改我的数据模型 (result.taskInstances[914].subtasks[5].identifier)
如您所见,我会立即跳到我实际遇到的问题。
我的问题是:有没有办法更快地调试我的数据模型和我从 API 返回的结果之间的不一致?
我正在使用json4s-native_2.10 版本3.2.8。
一个简化的例子:
{ "property": ["3c8723eceb1a", "cba8849e7a2f"] }
不与 Scala 啮合class:
case class Thing(property: String)
【问题讨论】:
-
您可以粘贴案例的示例 JSON 吗?
-
我看到你在 4 年前问过这个问题。我面临一些类似的问题。你找到解决办法了吗?
-
@aaronqli:不幸的是,我从来没有这样做过。