Как рассортировать список классов case в Spray

Первый пользователь спрея не смог найти ни одного подходящего примера по этому поводу. Я хочу разобрать ответ XML API, который содержит List[Person].

Произнесите case class Person(name: String, age: Int). Unmarshaller должен произвести соответствующий List[Person].

Спрей имеет значение по умолчанию NodeSeqUnmarshaller, но я не могу понять, как правильно связать вещи, был бы признателен за любые указатели.


person flavian    schedule 23.02.2015    source источник
comment
Определили ли вы JsonFormat для своего класса case, как определено здесь: github.com/spray/ ?   -  person lpiepiora    schedule 23.02.2015
comment
@lpiepiora Не уверен, какое это имеет отношение к распаковке XML.   -  person flavian    schedule 23.02.2015
comment
ах, извините, по какой-то причине я подумал, что вы говорите о JSON, забудьте об этом   -  person lpiepiora    schedule 23.02.2015
comment
@flavian, правильный ли ответ Дэрила? Вы забыли его принять?   -  person AmigoNico    schedule 21.05.2015


Ответы (1)


Мне пришлось решить эту проблему в моем приложении. Вот некоторый код, основанный на вашем примере класса case, который может оказаться полезным.

В моем подходе используется Unmarshaller.delegate, как обсуждалось здесь.

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))
  }
}
person Daryl Odnert    schedule 23.02.2015
comment
Спасибо за это, тем временем нашел метод делегата. - person flavian; 24.02.2015
comment
@flavian - Пожалуйста, примите мой ответ, если вы согласны с тем, что это способ решить проблему. Спасибо. - person Daryl Odnert; 24.02.2015