簡體   English   中英

使用Play Scala讀取解析JSON集合

[英]Parsing json collection using play scala reads

假設我有一個案例類:

case class Element(name: String)

和一個伴隨類,其內容為:

object Element {
  implicit val elementReads = (
    (JsPath / "name").read[String]
  )
}

我需要這些對象的地圖,因此:

object ElementMap {
  def apply(elements: Iterable[Element]) = {
    val builder = Map.newBuilder[String, Element]
    elements.foreach { x => builder += ((x.name, x)) }
    builder result       
  }
}

最后,我必須創建一個從JSON讀取的讀取:

implicit val elementMapReads = (
    (JsPath \ "elements").read[Seq[Element]]
)(ElementMap(_))

但是我在這里收到一條錯誤消息:

overloaded method value read with alternatives: (t: Seq[Element])play.api.libs.json.Reads[Seq[Element]] <and> (implicit r: play.api.libs.json.Reads[Seq[Element]])play.api.libs.json.Reads[Seq[Element]] cannot be applied to (Iterable[Element] ⇒ Map[String,Element])

這是一個工作版本:

case class Element(name: String)

object Element {
  implicit val elementReads: Reads[Element] =
    (JsPath \ "name").read[String].map(Element.apply)

  implicit val elementMapReads: Reads[Map[String, Element]] = 
    (JsPath \ "elements").read[Seq[Element]].map(ElementMap(_))
}

object ElementMap {
  def apply(elements: Iterable[Element]) = {
    val builder = Map.newBuilder[String, Element]
    elements.foreach { x => builder += ((x.name, x)) }
    builder result       
  }
}

在您的代碼中,隱式定義的elementReadsReads[String] ,而不是Reads[Element] 通常,最好在play-json中有顯式類型注釋,因為正在進行一些隱式轉換,需要它們。

另外, Reads[_]具有一個map方法,該方法在使用單字段包裝器時很方便,並且還解決了將Reads[Seq[Element]]轉換為Reads[Map[String, Element]]

最后,在Element elementMapReads對象中移動elementMapReads 應該使其自動可用(即,使用時無需導入); 我沒有測試它,但據我所知它應該可以工作。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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