spray-json для обычных классов (без регистра) в списке

Я нахожусь в ситуации, когда мне нужно сериализовать в 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]

В spray-json уже есть формат общего списка, и я предоставляю формат для своего класса, в чем может быть проблема?

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


person leonfs    schedule 28.10.2014    source источник


Ответы (2)


Когда я расширил 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])
    }
  }
person Vishal John    schedule 29.10.2014
comment
Спасибо. Это работает, хотя я до сих пор не знаю, почему черта CollectionFormats не включена. Я добавил его в импорт явно, но скомпилировал эфир. - person leonfs; 30.10.2014
comment
Нет необходимости импортировать CollectionFormats. DefaultJsonProtocol расширяет все эти свойства — github.com/spray/spray-json/blob/master/src/main/scala/spray/ - person Vishal John; 30.10.2014
comment
Я знаю, но тогда это не объясняет, почему это не работает при расширении JsonWriter вместо JsonFormat. Все еще расширяет DefaultJsonProtocol. - person leonfs; 30.10.2014
comment
У меня такое же поведение - создание Writer ни на что не повлияло. Изменение в формате делает. Интересно, что происходит за кулисами - это ошибка (в spray.json)? Раздражает, так как мне также нужен читатель, и теперь я должен найти способ вызвать читатель по умолчанию через мой формат. - person akauppi; 06.07.2015

Причина, кажется, упоминается здесь:

Проблема, с которой вы можете столкнуться только с JsonReader/JsonWriter, заключается в том, что когда вы пытаетесь найти JsonReader/JsonWriter для Option или коллекции, он ищет JsonFormat для содержащегося типа, что не удастся. Не уверен, что я что-то упускаю, что решит эту проблему.

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

Ну что ж...

person akauppi    schedule 06.07.2015
comment
Я бы посоветовал вам использовать json4s. Это сделает вашу жизнь намного проще. По крайней мере, это то, что я в итоге сделал. Никаких сожалений. - person leonfs; 07.07.2015
comment
Спасибо за предложение, но в остальном я доволен spray-json. - person akauppi; 07.07.2015