Нет экземпляра play.api.libs.json.Format доступен для scala.collection.immutable.List [Item] - PullRequest
0 голосов
/ 25 июня 2019

Примечание: я очень новичок в PlayFramework.

Я пытаюсь сериализовать объект элемента в строку JSON.Я получаю следующую ошибку:

 No instance of play.api.libs.json.Format is available for 
 scala.collection.immutable.List[Item] in the implicit scope (Hint: if declared
 in the same file, make sure it's declared before)

 [error]   implicit val itemRESTFormat: Format[ItemREST] = 
 Json.format[ItemREST]

Я действительно не понимаю, что означает эта ошибка, или не знаю, что происходит.Если бы кто-то мог объяснить мне, что означает ошибка и какова потенциальная проблема, это было бы здорово.Спасибо!

import...

case class ItemREST(items: List[Item]) {
    def toJson: String = Json.toJson(this).as[JsObject].toString()
}

object ItemREST {
    implicit val itemRESTFormat: Format[ItemREST] = Json.format[ItemREST]

    def fromItem(items: List[Item]): ItemREST = {
        ItemREST(items)
    }
}

1 Ответ

2 голосов
/ 25 июня 2019

В вашем коде ItemREST есть список элементов типа Item.Следовательно, для сериализации ItemREST требуется сериализатор для Item.

object Item {
  implicit val itemFormat = Json.format[Item]
}

object ItemREST {
  implicit val itemRESTFormat: Format[ItemREST] = Json.format[ItemREST]
}

Вам просто нужно объявить сериализатор Item перед ItemREST, и это решит вашу проблему.

Кроме того, вы можете попробовать добавить

implicit val itemFormat = Json.format[Item]

непосредственно перед

  implicit val itemRESTFormat: Format[ItemREST] = Json.format[ItemREST]

Полный код будет выглядеть следующим образом

case class Item(i : Int)
case class ItemList(list : List[Item])

object ItemList{
  implicit  val itemFormat = Json.format[Item]
  implicit  val itemListFormat = Json.format[ItemList]
}


object SOQ extends App {

  println(Json.toJson(ItemList(List(Item(1),Item(2)))))

}

, что даст вам n вывод в виде

{"list":[{"i":1},{"i":2}]}
...