2016-05-25 2 views
1

Как управлять десериализацией для распылителя? Например, у меня есть класс, определяемый как:Серийная обработка Akka-HTTP JSON

случае класс A (Name: String, Value: String)

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

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

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

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

проблема заключается в том, что по умолчанию JSON представление этого списка это один, который я не хотите:

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

Как это сделать?

ответ

2

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

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))