【问题标题】:Read JSON Tree structure in Scala Play Framework在 Scala Play Framework 中读取 JSON 树结构
【发布时间】:2013-10-27 03:08:21
【问题描述】:

我正在尝试在 Play Framework 2.1.3 中处理 Ajax POST 请求。帖子数据是一个 JSON 对象,具有如下树形结构:

{ id: "a", name: "myname", kids : [{ id: "a1", name : "kid1", kids: []}, {id: "a2", name: "kid2", kids: [{id: "aa1", name :"grandkid", kids: []}]}]

我想将“孩子”嵌套任意深。我想到的课程是这样的(我意识到递归可能有问题):

case class Person {
  id: String,
  name: String,
  kids: Array[Person]
}

我想到的格式:

implicit val personFormat:Format[Person] = Json.format[Person]

Play 在我写的格式上抛出错误:

类型不匹配;发现:controllers.Resources.Person 需要:Array[controllers.Resources.Person]

我知道 Play 具有树结构。我找不到有关如何将其与 JSON 读取联系起来的示例/文档。

非常感谢任何帮助,谢谢

【问题讨论】:

    标签: json scala playframework playframework-2.0


    【解决方案1】:

    您将需要一个递归 val,例如:

    implicit val jsonReads: Reads[Person] = ((__ \ "id").read[String] and (__ \ "name").read[String] and (__ \ "kids").read[Seq[Person]])(apply _)
    

    (我已将集合类型从 Array 更改为 Seq,因为它更通用,并且允许您在不影响下线代码的情况下更改实现。)

    这是使用here 记录的语法。

    【讨论】:

    • 谢谢罗宾,我正在尝试合并您的答案,但出现编译错误“未找到:值适用”。我错过了一些基本的东西吗? Person 类中的“孩子”是否需要为“Seq [Person]”才能回答您的问题?谢谢!
    • 哦,我猜你没有在伴生对象中声明它。所以只需将apply 更改为Person。您可以将其更改为Array,但我不确定Play 是否可以自动读取Arrays;这就是为什么我建议将Person 中使用的集合类型从Array 更改为Seq。抱歉,如果不清楚。
    【解决方案2】:

    我看到这项工作的唯一方法是在您的 Person 案例类中使用 JsArray 或 Array[String] 而不是 Array[Person]。 JSON 宏 Inception 只能为已经存在隐式 JSON 读+写代码的对象生成基元和列表、映射和数组的读+写代码。本质上,您不能拥有引用自身的案例类。

    package models
    
    import play.api.libs.json._
    
    case class Person(
      id   : String,
      name : String,
      kids : JsArray
    )
    
    object Person extends ((String,String,JsArray) => Person) {
    
      implicit val jsonFormat = Json.format[Person]
    
    }
    

    【讨论】:

    • 这不是好的设计;那是暴露电线表示;如果您决定也接受 XML 怎么办?
    • 问题是如何读取 JSON 结构,XML 无关紧要。
    • 我在谈论一个潜在的未来设计决策。但即便如此,您也不应该在案例类中公开连线表示 - 它会强制客户端代码关注反序列化,而不必担心。
    • Jason(和 Robin),非常感谢您帮助我解决这个问题!这两种解决方案都像一个魅力,帮助我更好地理解 Play/Scala。谢谢!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-01-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多