繁体   English   中英

无法让Writes与Scala Play一起使用

[英]Having trouble getting Writes to work with Scala Play

首先,我想对很长的帖子说声抱歉,对于那些仍然关注我的问题的人,我深表感谢。

我有一个控制器,应该返回一个具有以下结构的json-response:

{
   result: [
       {
           key: value,
           key: value,
           key: value,
           key: [
              {
                 key: value,
                 key: value,
                 key: value
              },...
           ]
       },....
   ]
}

但是,我无法按需运行写入。

注意。 我将在有问题的行下添加评论。

object APIController extends Controller {

  def feed() = Action {
    val objects = repo.getObjects().toList
    Ok(Json.toJson(Json.obj("result" -> Class_1.apply(objects).result)))
  }

首先,如果我不创建Json.obj("result" -> List[objects]) ,结果键将不会显示在JSON结果中。 如果为此添加一个Writer,则会出现错误,指出List [objects]必须具有Writer。 但是,如果我像上面那样写,它不需要List [objects]的Writer

  case class Class_1 (result: Seq[Class_2])
  object Class_1 {
    def apply(objs: List[Object]) = {
      var result:ListBuffer[Class_2] = ListBuffer[Class_2]()
      for(obj <- objs) feedResult += Class_2.apply(code)
      new Class_1(result.toList)
    }
   }

*这是我将Writer for Class_1放在这里的地方。 但是,如果我像implicit val class1Writer = new Writes[Class_1] { override def writes(o: Class_1): JsValue = Json.obj("result" -> o.result) }我遇到了前面提到的问题,那就是我突然需要Writes for a List [objects] that type *

  case class Class_2 (id: Long, id2: Long, listOfStuff: Seq[Class_3])
  object Class_2 {
    def apply(obj: Object) = {
      var items: ListBuffer[Class_3] = ListBuffer[Class_3]()
      for(obj1 <- obj.getListOfStuff()) items += Class_3.apply(obj1)
      new Class_2(obj.firstID, obj.secID, items.toList)
    }
  }
  implicit val class2Writes = new Writes[Class_2] {
    override def writes(o: Class_2): JsValue = {
      Json.obj(
        "id" -> o.id,
        "id2" -> o.id2,
        "items" -> o.listOfStuff
      )
    }
  }

*在"items" -> o.listOfStuff说,它需要一个WritesList[types in the list] ,但我对对象中写道列表(Class_3),我并不需要一个Writes序列化时来自Class_2的对象列表,为什么会这样?*

  case class Class_3 (id: Long, text: String)
  object Class_3 {
    def apply(obj: Object) = {
      new Class_3(obj.id, obj.funnyText)
    }
  }
  implicit val class3Writer = new Writes[Class_3] {
    override def writes(o: Class_3): JsValue = {
      Json.obj(
        "id" -> o.id,
        "text" -> o.text
      )
    }
   }
}

我从这段代码中得到的错误是:

No Json deserializer found for type Seq[Class_3]. Try to implement an implicit Writes or Format for this type.
[error]         "items" -> o.listOfStuff
[error]                             ^

如果我在Writes中删除此行,它将编译并运行。 而且我认为这很奇怪,因为我序列化的第一个列表没有Writer,仅针对列表中的对象。

有谁知道为什么会这样? 我该怎么做才能完成我的追求? (我希望你能明白我在做什么)

提前致谢。

只要把implicit val class3Writer提前class2Writes

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM