[英]How to parse JSON empty string as `None` using Play Json?
我有一個案例類,它是一個“字段包”-許多表示業務實體的字段。 就我的用例而言, ""
, null
和JSON對象中完全不存在的k/v
之間的區別與我無關。 在這種情況下,這些字段已經是Option[String]
,所以我希望所有這三種情況都折疊為None
。 我相信自動生成的Reads
的當前行為是我想要的,除了空字符串情況。
此BOF將來可能會更改,因此“只需實現您自己的Reads
”(如此處建議: 使play-json將空字符串讀取為Option [T]類型的None即可 )或其他必須重新設置的內容-枚舉所有字段不是入門者。
我認為我可能需要Play的“ Json變形金剛”。 編寫一個轉換器來刪除條目(如果它們具有空值)似乎很簡單,但是我不知道是如何與自動生成的Reads
實現一起編寫的。
我想象我需要的是一些在Reads
和Reads
組合器,一些簽名,例如: (JSON -> JSON, JSON -> T) -> (JSON -> T)
。 顯然,我找到了以下頁面: https : //www.playframework.com/documentation/2.5.x/ScalaJsonCombinators ,但是列出的組合器都沒有我想要的。 這個組合器可以容易實現嗎? 我可能會有點不適應類型,但是如果我能得到一些指導的話,那將是一個很好的解決方案。
這對我有用:
class RemoveEmpty[T] (reader: Reads[T]) extends Reads[T] {
override def reads(json: JsValue): JsResult[T] = json match {
case JsObject(underlying) => {
reader.reads(JsObject(underlying.filterNot{ case (k, v) => jsonValueEmpty(v) } ))
}
case _ => {
JsError("Non-JsObj passed to RemoveEmpty")
}
}
def jsonValueEmpty(v: JsValue) = v match {
case JsNull | JsString("") => true
case _ => false
}
}
然后,您可以像這樣使用它:
implicit val myTypeReads = new RemoveEmpty(Json.reads[MyType])
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.