[英]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.