[英]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
}
}
在您的代碼中,隱式定義的elementReads
是Reads[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.