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