如何在Spray中解组case类的列表

时间:2015-02-23 16:31:03

标签: xml scala spray spray-client

第一次喷涂用户无法在任何地方找到任何正确的示例。我想要解组包含List[Person]

的XML API响应

case class Person(name: String, age: Int)。 unmarshaller应该生成适当的List[Person]

Spray有一个默认的NodeSeqUnmarshaller,但是我无法弄清楚如何正确地连接东西,对任何指针都会感激不尽。

1 个答案:

答案 0 :(得分:5)

我必须在我的应用程序中解决这个问题。以下是一些基于您的示例案例类的代码,您可能会发现这些代码很有帮助。

我的方法使用了Unmarshaller.delegate here

import scala.xml.Node
import scala.xml.NodeSeq
import spray.httpx.unmarshalling._
import spray.httpx.unmarshalling.Unmarshaller._

case class Person(name: String, age: Int)

object Person {
  def fromXml(node: Node): Person = {
    // add code here to instantiate a Person from a Node
  }
}

case class PersonSeq(persons: Seq[Person])

object PersonSeq {
  implicit val PersonSeqUnmarshaller: Unmarshaller[PersonSeq] = Unmarshaller.delegate[NodeSeq, PersonSeq](MediaTypes.`text/xml`, MediaTypes.`application/xml`) {
    // Obviously, you'll need to change this function, but it should
    // give you an idea of how to proceed.
    nodeSeq =>
      val persons: NodeSeq = nodeSeq \ "PersonList" \ "Person"
      PersonSeq(persons.map(node => Person.fromXml(node))
  }
}