从对象PlayFramework构建JSON

时间:2015-11-18 19:17:33

标签: json scala playframework

使用Play ScalaJson(https://www.playframework.com/documentation/2.4.x/ScalaJson)从scala case class构建JSON我必须手动构建JsObject或实现implicit Writes(这实际上也意味着手动工作)。

使用lift-web json lib时,我可以定义implicit f Formats = net.liftweb.json.DefaultFormats,所有转换都将在后台完成。

有什么方法可以使用play框架json lib在json中轻松转换scala case类吗?

2 个答案:

答案 0 :(得分:2)

您可以使用宏为任何案例类OWrites[T]定义实例或Reads[T]OFormat[T]T

implicit val writes: Writes[T] = play.api.libs.json.Json.writes[T]
// Same for Reads or OFormat

由于OFormatOWrites已定义(隐含),因此可以使用.toJson

val jsValue: JsValue = Json.toJson(instanceOfT)

为了保持对象的特异性,即将JsValue键入为JsObject,可以直接调用.writes

val jsObj: JsObject = implicitly[OWrites[T]].writes(instanceOfT)
// works even if a OFormat is defined, as 'compatible'

由于定义了OFormatReads,因此可以使用.fromJson

val t: JsResult[T] = Json.fromJson[T](jsValue)

答案 1 :(得分:-1)

一个简单的解决方案是使用包含辅助函数的Play Json来处理JsValues,并在模型的伴随对象中定义隐式格式。此格式将在序列化和反序列化中隐式使用。以下是一个例子。

import play.api.libs.json.Json

case class User(name: String, age: Int)

object {
  implicit val format = Json.format[User]
}

有关更全面的示例,请查看此存储库:https://github.com/luongbalinh/play-mongo/blob/master/app/models/User.scala