【问题标题】:Nesting json - Play 2.3嵌套 json - 玩 2.3
【发布时间】:2014-08-21 06:40:42
【问题描述】:

我正在尝试像这样嵌套 json:

case class Foo(id:Int, a:String, b:String)

def barJson =
  Json.obj("hello" -> "hi")

def getFooJson =
  Json.obj {
    "foos" -> Json.arr {
      fooTable.list.map { foo =>
        Json.toJson(foo) + barJson
      }
    }
  }

但是我收到了这个错误:

type mismatch;
[error]  found   : play.api.libs.json.JsObject
[error]  required: String

我在这里做错了什么以及如何解决?我追求的结果是这样的:

"foos":[
    {
      "a":"hi", 
      "b":"bye", 
      "bar": {
        "hello": "bye"
      }
    }, 
    {
      "a":"hi2", 
      "b":"bye2", 
      "bar": {
        "hello": "bye"
      }
    }
]

【问题讨论】:

    标签: json scala playframework playframework-2.3


    【解决方案1】:

    问题是+添加字段的方法在JsObject上,而Json.toJson(foo)只是一个JsValue。如果你确定你的WritesFoo 总是产生一个对象,你可以使用.as[JsObject]

    def getFooJson =
      Json.obj {
        "foos" -> Json.arr {
          fooTable.list.map { foo =>
            Json.toJson(foo).as[JsObject] + ("bar" -> barJson)
          }
        }
      }
    

    另请注意,如果您希望 JSON 出现在您的预期结果中,您需要向 + 提供一个键值对。

    对于它的价值,我可能会写如下内容:

    val fooTableWrites = Writes.list(
      JsPath.write[Foo].transform(_.as[JsObject] + ("bar" -> barJson))
    ).transform(arr => Json.obj("foos" -> arr))
    
    def getFooJson = fooTableWrites.writes(fooTable.list)
    

    做同样的事情,但你有更多可组合的片段。

    【讨论】:

    • 有没有办法在那个嵌套中嵌套一个 Json.obj ? Json.toJson(foo).as[JsObject] + ("bar" -> Json.toJson(foo).as[JsObject] + ("anotherFoo" -> Json.toJson(foo2)))
    • 应该可以,但您可能需要一组额外的括号。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-08-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-05-21
    相关资源
    最近更新 更多