对于scala.collection.immutable.List [Item],没有play.api.libs.json.Format实例可用。

时间:2019-06-25 15:23:21

标签: scala playframework play-json

注意:我是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 个答案:

答案 0 :(得分:2)

在您的代码中,ItemREST具有类型为Item的元素列表。因此,要序列化ItemREST,需要Item的序列化器。

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

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

您只需要在ItemREST之前声明Item的序列化程序,即可解决您的问题。

此外,您可以尝试的一件事是添加

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}]}