1

我正在尝试使用 play-json 从 GitHub API 解析 json,并merge_commit_sha在 Pull Requests 上遇到了该字段的问题(顺便说一下,我知道该字段已被弃用,但不想在此解析问题中讨论这个问题!) . 不幸merge_commit_sha的是,在某些情况下,字段会以空字符串的形式返回:

"merge_commit_sha": ""

这是在我的案例类中声明该字段的方式:

merge_commit_sha: Option[ObjectId],

我有一个implicitFormat[ObjectId],它不能容忍空字符串,因为这不是Git 哈希ID 的有效值。我还使用了Read[PullRequest]我想继续使用的 play-json macro-generated ,而不是单独声明拉取请求中每个字段的读取。

由于我已将该字段声明为选项,因此我希望"merge_commit_sha": ""将其读取为 value None,但这不是当前发生的情况 - 存在一个字符串,因此Format[ObjectId]调用了 并返回一个JsFailure.

我尝试过的一件事是声明具有所需行为的隐式Format[Option[ObjectId]],但它似乎没有被宏生成的Read[PullRequest].

4

1 回答 1

0

您可以自己定义自定义读取和写入

UsingJson.format[MyType]使用 Scala 宏。你也许可以参与其中。虽然,为此“扩展”宏case class似乎是错误的。

自定义读取和写入可能有点“样板式”和无聊,但它们有其优点。

例如,如果您的 json 上有一堆新字段,则JsError在验证或将其转换为case class. 您只需从 JSON 中获取您需要的内容并创建对象。它还允许将您的内部模型与您正在消费的内容分开,这在某些情况下是首选。

我希望这有帮助,

里斯


编辑

在使用其他一些 JSON 库后,我可能已经找到了您要查找的内容。我知道这个问题是在 Play JSON 之后专门提出的。

如果您能够摆脱 Play JSON,请特别查看spray-json- shapelessJsNullBehaviourJsNullNotNone REF

于 2016-05-25T16:00:12.040 回答