无法使用Scala Play进行写入

时间:2014-02-13 13:13:11

标签: json scala playframework playframework-2.1 jsonserializer

首先,我想对长篇文章说抱歉,我真的很感激那些仍在研究我的问题的人。

我有一个控制器应该返回一个json响应,其结构如下:

{
   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用于Class_1的地方。但如果我这样做 implicit val class1Writer = new Writes[Class_1] { override def writes(o: Class_1): JsValue = Json.obj("result" -> o.result) }我遇到了前面提到的问题,我突然需要为该类型的List [对象]写一个*

  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表示Writes需要List[types in the list],但我有列表中对象的写入(Class_3),我不需要{{1当从Class_2序列化对象列表时,为什么它的行为如此?*

Writes

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

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

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

有谁知道它为什么会这样? 我该怎么做才能完成我追求的目标? (我希望你能看到我想要做的事情)

提前致谢。

1 个答案:

答案 0 :(得分:1)

  

只需将implicit val class3Writer置于class2Writes

之前