make play-json读取空字符串为None为类型的Option [T]

时间:2016-05-25 15:51:31

标签: scala playframework scala-option play-json

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

"merge_commit_sha": ""

字段为declared in my case class

merge_commit_sha: Option[ObjectId],

我有一个implicit Format[ObjectId],它不能容忍空字符串,因为这不是Git哈希id的有效值。我也在使用play-json宏生成的Read[PullRequest],我希望继续使用它,而不是单独声明拉取请求中每个字段的读取。

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

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

1 个答案:

答案 0 :(得分:0)

您可以自己定义自定义Reads and Writes

使用Json.format[MyType]使用Scala宏。 You may be able to hook into that。虽然“扩展”这个case class的宏似乎是错误的。

自定义读取和写入可能有点“类似于样板”而且很无聊,但它们有其优点。

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

我希望这有帮助,

里斯

<小时/> 的修改

使用其他一些JSON库后,我可能已经找到了你要找的东西。 我知道问题是在Play JSON之后专门询问。

如果您能够远离Play JSON,请专门JsNullBehaviour JsNullNotNone和{{1}} spray-json-shapeless查看。