java play json转list,在Play中将Seq映射到JSON

为需要序列化的图中的每个类定义遵循其依赖顺序的格式化程序 .

格式化 Book 需要格式化 Author ,因此在 Book 格式化程序之前定义 Author 格式化程序 .

例如,使用此 Models.scala 文件:

package models

import play.api.libs.json._

case class Book(title: String, authors: Seq[Author])

case class Author(name: String)

object Formatters {

implicit val authorFormat = Json.format[Author]

implicit val bookFormat = Json.format[Book]

}

这个 JsonExample.scala 文件:

package controllers

import models._

import models.Formatters._

import play.api.mvc._

import play.api.libs.json._

object JsonExample extends Controller {

def listBooks = Action {

val books = Seq(

Book("Book One", Seq(Author("Author One"))),

Book("Book Two", Seq(Author("Author One"), Author("Author Two")))

)

val json = Json.toJson(books)

Ok(json)

}

}

对 listBooks 的请求将产生以下结果:

< HTTP/1.1 200 OK

< Content-Type: application/json; charset=utf-8

< Content-Length: 133

<

[{"title":"Book One","authors":[{"name":"Author One"}]},{"title":"Book Two","authors":[{"name":"Author One"},{"name":"Author Two"}]}]

对于更高级的格式化,包括部分序列化以避免必须为不应序列化的类声明格式化程序,请参阅JSON Reads/Writes/Format Combinators .

应该记住,要序列化的类不一定必须是域模型类 . 声明反映所需JSON结构的数据传输对象(DTO)类并从域模型实例化它们可能会有所帮助 . 这样,使用 Json.format 可以直接进行序列化,并且不存在部分序列化的问题,并且具有JSON API的类型安全表示的额外好处 .

例如,此 BookDTO.scala 文件定义了一个 BookDTO 数据传输对象,该对象仅使用可序列化为JSON的类型,而无需进一步定义:

package dtos

import models._

import play.api.libs.json.Json

case class BookDTO (title: String, authors: Seq[String])

object BookDTO {

def fromBook(b: Book) = BookDTO(b.title, b.authors.map(_.name))

implicit val bookDTOFormat = Json.format[BookDTO]

}

这个 JsonExample2.scala 文件显示了如何使用这个模式:

package controllers

import dtos._

import dtos.BookDTO._

import models._

import play.api.mvc._

import play.api.libs.json._

import play.api.libs.functional.syntax._

object JsonExample2 extends Controller {

def listBooks = Action {

val books = Seq(

Book("Book One", Seq(Author("Author One"))),

Book("Book Two", Seq(Author("Author One"), Author("Author Two")))

)

val booksDTO = books.map(BookDTO.fromBook(_))

Ok(Json.toJson(booksDTO))

}

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值