繁体   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