Joy*_*age 13 json scala playframework-2.0
我有两个从案例类创建的JsValue,即Book和Book详细信息
val bookJson = Json.tojson(Book)
val bookDetailJson = Json.tojson(BookDetail)
Run Code Online (Sandbox Code Playgroud)
格式为:
//Book
{
id: 1,
name: "A Brief History of Time"
}
//BookDetail
{
bookId: 1,
author: "Steven Hawking",
publicationDate: 1988,
pages: 256
}
Run Code Online (Sandbox Code Playgroud)
如何将它们合并到play-framework 2.10中的单个Json?即
//Book with detail
{
id: 1,
name: "A Brief History of Time",
bookId: 1,
author: "Steven Hawking",
publicationDate: 1988,
pages: 256
}
Run Code Online (Sandbox Code Playgroud)
我正在尝试转换,但未能遍历第二个JsValue:
val mapDetail = (__).json.update(
__.read[JsObject].map { o =>
o.deepMerge( JsObject(Seq(("detail", bookDetailJson))) )
})
bookJson.validate(mapDetail).get
Run Code Online (Sandbox Code Playgroud)
它会降低一级,我真的不想要.
//Book with detail
{
id: 1,
name: "A Brief History of Time",
detail: {
bookId: 1,
author: "Steven Hawking",
publicationDate: 1988,
pages: 256
}
}
Run Code Online (Sandbox Code Playgroud)
如果有任何技巧可以提供这个Json变换,请告诉我.非常感谢!
tys*_*njh 17
Play现在为JSON提供了许多新功能.这将是一个很好的展示Format[A]特性(参见Scala Json Inception),您可以隐藏地显示,或者显式地包含需要隐式的方法Format[A]/Reads[A]/Writes[A].
创建一个case类来表示你的JSON对象,
case class Book(id: Int, name: String)
case class BookDetail(id: Int, author: String, publicationDate: Int, pages: Int)
Run Code Online (Sandbox Code Playgroud)
创建包含隐式的伴随对象,Format[A]以便Format/Reads/Writes在需要时自动在范围内.
object Book {
implicit val fmt: Format[Book] = Json.format[Book]
}
object BookDetail {
implicit val fmt: Format[BookDetail] = Json.format[BookDetail]
}
Run Code Online (Sandbox Code Playgroud)
现在你可以做这样的事情,
val bookJson = Json.toJson(Book(1, "A Brief History Of Time"))
val bookDetailJson = Json.toJson(BookDetail(1, "Steven Hawking", 1988, 256))
bookJson.as[JsObject].deepMerge(bookDetailJson.as[JsObject])
Run Code Online (Sandbox Code Playgroud)
你会有一个像这样的物体,
{
id: 1,
name: "A Brief History Of Time",
author: "Steven Hawking",
publicationDate: 1988,
pages: 256
}
Run Code Online (Sandbox Code Playgroud)
我在REPL中尝试了这个但是它不起作用,在Play应用程序中它确实很好.同样在生产场景中,我们可能会用它asOpt[T]来代替as[T].
以下是为什么asOpt[T]可能更适合的示例,假设您获得的书籍不是有效的JSON对象,
val bookJson = Json.toJson("not a book")
Run Code Online (Sandbox Code Playgroud)
你最终会得到一个
[JsResultException: JsResultException(errors:List((,List(ValidationError(validate.error.expected.jsobject,WrappedArray())))))]
Run Code Online (Sandbox Code Playgroud)
但是假设您改变了要使用的方法asOpt[T],
bookJson.asOpt[JsObject].getOrElse(Json.obj()).deepMerge(bookDetailJson.asOpt[JsObject].getOrElse(Json.obj()))
Run Code Online (Sandbox Code Playgroud)
现在你将得到至少一个部分JSON对象,
{
id: 1,
author: "Steven Hawking",
publicationDate: 1988,
pages: 256
}
Run Code Online (Sandbox Code Playgroud)
因此,根据您希望如何处理格式不正确的JSON,您可以选择其中一个选项.
| 归档时间: |
|
| 查看次数: |
15132 次 |
| 最近记录: |