2014-10-28 4 views
6

Я нахожусь в ситуации, когда мне нужно сериализовать в JSON класс без case.спрей-json для нормальных классов (не случай) в списке

Имея класс, как:

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

Я создал JsonProtocol для этого класса:

object MyClassJsonProtocol extends DefaultJsonProtocol { 

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

Позже в коде я импортировать протокол ..

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

val json = aListOfMyClasses.toJson 

При попытке построить проект я получаю следующую ошибку:

Не может найти JsonWriter или JsonFormat для класса типа List [MyClass]

распыления JSON уже имеет формат общего список и я обеспечиваю формат для своего класса, что бы быть проблемой?

Заранее спасибо ... !!!

ответ

3

Когда я протянул MyClassJsonFormat из JsonFormat вместо JsonWriter, он смотрел работает отлично. Похоже, эта черта CollectionFormats будет работать только если вы простираться от JsonFormat

Следующий код компилируется нормально для меня

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. Он работает, хотя я до сих пор не знаю, почему свойство CollectionFormats не включено. Я добавил его в импорт явно, но собирал эфир. – leonfs

+0

Не нужно импортировать CollectionFormats. DefaultJsonProtocol расширяет все эти черты - https://github.com/spray/spray-json/blob/master/src/main/scala/spray/json/DefaultJsonProtocol.scala#L26 –

+0

Я знаю, но тогда это не объясняет почему он не работает при расширении JsonWriter вместо JsonFormat. По-прежнему расширяется DefaultJsonProtocol. – leonfs

0

Причина, кажется, упоминается 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.

Вы и Я столкнулся с этим. В настоящий момент я не вижу другого выхода, кроме предложения @ user007 использовать полный JsonFormat. Это, само по себе, приносит больше трудностей, по крайней мере, для меня - я планировал использовать читатель по умолчанию для своего класса.

О, ну ...

+0

Я предлагаю вам использовать json4s. Это облегчит вам жизнь. По крайней мере, это то, что я сделал. Никаких сожалений. – leonfs

+0

Спасибо за предложение, но я доволен спрей-джсон, иначе. – akauppi