簡體   English   中英

如何使用Play Json將JSON空字符串解析為`None'?

[英]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實現一起編寫的。

我想象我需要的是一些在ReadsReads組合器,一些簽名,例如: (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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM