Сериализация Akka-HTTP JSON

Как контролировать десериализацию для spray-json? Например, у меня есть класс, определенный как:

класс случая A (имя: строка, значение: строка)

И я хотел бы десериализовать следующий JSON в список объектов A:

{
   "one": "1",
   "two": "2"
}

и должно стать:

List(A("one", "1"), A("two", "2"))

Проблема в том, что JSON-представление этого списка по умолчанию таково, что мне не нужно:

[
   { "Name": "one", "Value": "1" },
   { "Name": "two", "Value": "2" }
]

Как я могу это сделать?


person Will I Am    schedule 25.05.2016    source источник


Ответы (1)


Вы можете написать свой собственный десериализатор для структуры, которую вы ищете:

  case class A(Name:String, Value:String)

  implicit object ListAFormat extends RootJsonReader[List[A]] {
    override def read(json: JsValue): List[A] = {
      json.asJsObject.fields.toList.collect {
        case (k, JsString(v)) => A(k, v)
      }
    }
  }

  import spray.json._

  def main(args: Array[String]): Unit = {
    val json =
      """
        |{
        |   "one": "1",
        |   "two": "2"
        |}
      """.stripMargin

    val result = json.parseJson.convertTo[List[A]]
    println(result)
  }

Отпечатки:

List(A(one,1), A(two,2))
person ale64bit    schedule 25.05.2016