2014-10-28 14 views
6

Znajduję się w sytuacji, w której muszę przekształcić JSON w klasę non-case.spray-json dla klas normalnych (bez nich) na liście

posiadające klasy jako:

class MyClass(val name: String) { 
    def SaySomething() : String = { 
    return "Saying something... " 
    } 
} 

Utworzyłem JsonProtocol dla tej klasy:

object MyClassJsonProtocol extends DefaultJsonProtocol { 

    implicit object MyClassJsonFormat extends JsonWriter[MyClass] { 
    override def write(obj: MyClass): JsValue = 
    JsObject(
     "name" -> JsString(obj.name) 
    ) 
    } 
} 

Później w kodzie importować protokół ..

val aListOfMyClasses = List[MyClass]() ... // lets assume that has items and not an empty list 
import spray.json._ 
import MyClassJsonProtocol._ 

val json = aListOfMyClasses.toJson 

Podczas próby zbudowania projektu pojawia się następujący błąd:

Nie można znaleźć JsonWriter lub JsonFormat dla klasy typu listy [MojaKlasa]

natryskowego json ma już formatu listy rodzajowy i jestem zapewniając format dla mojej klasy, jaki byłby problem?

Z góry dziękuję ... !!!

Odpowiedz

3

Kiedy przedłużony MyClassJsonFormat z JsonFormat zamiast JsonWriter, to patrzył działa poprawnie. Wygląda na to cecha CollectionFormats będzie działać tylko wtedy, gdy odchodzą od JsonFormat

Poniższy kod kompiluje dobrze dla mnie

object MyClassJsonProtocol extends DefaultJsonProtocol { 

    implicit object MyClassJsonFormat extends JsonFormat[MyClass] { 
    override def write(obj: MyClass): JsValue = 
     JsObject(
     "name" -> JsString(obj.name) 
    ) 

     override def read(json: JsValue): MyClass = new MyClass(json.convertTo[String]) 
    } 
    } 
+0

Thks. Działa, chociaż nadal nie wiem, dlaczego nie zawarto cechy CollectionFormats. Dodałem go do importu jawnie, ale skompilowałbym eter. – leonfs

+0

Nie ma potrzeby importowania CollectionFormats. DefaultJsonProtocol rozszerza wszystkie te cechy - https://github.com/spray/spray-json/blob/master/src/main/scala/spray/json/DefaultJsonProtocol.scala#L26 –

+0

Wiem, ale to nie wyjaśnia dlaczego nie działa przy rozszerzaniu JsonWriter zamiast JsonFormat. Wciąż rozszerza DefaultJsonProtocol. – leonfs

0

Przyczyną wydaje się być wymienione here:

An issue you might run into with just JsonReader/JsonWriter is that when you try to lookup JsonReader/JsonWriter for Option or a collection, it looks for a JsonFormat for the contained type, which will fail. Not sure if there is something I am missing that will fix that issue.

Ty i Wpadłem na to. W tej chwili nie widzę innego wyjścia niż sugestia użytkownika @ user007, aby użyć pełnego JsonFormat. To samo w sobie przynosi więcej trudności - przynajmniej planowałem użyć domyślnego czytnika dla mojej klasy.

No cóż ...

+0

Proponuję użyć json4s. Ułatwi ci to życie. Tak przynajmniej to zrobiłem. W ogóle nie żałuję. – leonfs

+0

Dzięki za sugestię, ale jestem raczej zadowolony z spray-json, w przeciwnym razie. – akauppi

Powiązane problemy