首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >很难用Scala剧本写文章

很难用Scala剧本写文章
EN

Stack Overflow用户
提问于 2014-02-13 13:13:11
回答 1查看 89关注 0票数 0

首先,我想为我的长期职位说声抱歉,我真的很感谢那些还在调查我的问题的人。

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

代码语言:javascript
复制
{
   result: [
       {
           key: value,
           key: value,
           key: value,
           key: [
              {
                 key: value,
                 key: value,
                 key: value
              },...
           ]
       },....
   ]
}

然而,我有问题,让写的工作,我想。

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

代码语言:javascript
复制
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,就会看到错误,说明Listobjects必须有一个Writer。但是,如果我像上面这样编写它,它不需要为Listobjects编写一个Writer

代码语言:javascript
复制
  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)
    }
   }

*这就是我将Class_1的作者放在这里的地方。但是,如果我像implicit val class1Writer = new Writes[Class_1] { override def writes(o: Class_1): JsValue = Json.obj("result" -> o.result) }这样做,我会遇到我前面提到的问题,我突然需要为该类型的Listobjects编写一个写。

代码语言:javascript
复制
  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说它需要一个List[types in the list]Writes,但是对于列表中的对象(Class_3)我有一个写,当序列化来自Class_2的对象列表时,我不需要Writes,为什么它是这样的呢?

代码语言:javascript
复制
  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
      )
    }
   }
}

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

代码语言:javascript
复制
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]                             ^

如果在写操作中删除这一行,它将编译并工作。我觉得这很奇怪,因为我序列化的第一个列表没有一个Writer,只针对列表中的对象。

有人知道它为什么会这样吗?我该怎么做才能完成我想要的?(我希望你看到我想做的事)

提前谢谢。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2014-02-13 15:56:23

implicit val class3Writer放在class2Writes前面就行了

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/21755270

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档