播放 Scala JSON 正文解析器默认值字段



您好,我在使用JSON正文解析器时遇到问题。我的问题是以下我有一个带有一些可选参数(选项[T])的案例类和一个具有默认值的参数,我不想将其键入为选项[T]。

但是,当解析省略了默认值字段的 JSON 正文时,我收到错误

play.api.libs.JsError
/count error path missing

这是我的控制器代码:

object MyController extends Controller{

  implicit val itemWrites = Json.writes[Item]
  implicit val itemReads = Json.reads[Item]
  implicit val itemFormats = Json.format[Item]
  def add = DBAction(parse.json){ implicit rs =>
    val item =  rs.request.body.validate[Item]
}

这是我的案例类:

case class Item( id:Option[Int], name:String, description:Option[String], count:Int=0)

我有机会使用默认值字段实现与 Option[T] 相同的行为吗?

谢谢

我正在使用:

  • 斯卡拉 2.10
  • 播放框架 2.2.1
  • 玩滑插件 0.5.0.8

几乎。您可以使用如下所示的选项定义默认值:

case class Item( description:Option[String] = Some("String"))

如果您绝对不想要选项,可以在此处查看:

重头戏 2 JSON 格式中缺少属性的默认值

一种解决方法是编写一个 apply 方法,该方法将默认值 count 作为选项并处理构造(不能将其命名为 apply,因为我们在构建 Reads 时需要一个明确的名称):

object Item{
  def applyOpt(id:Option[Int], name:String, description:Option[String], count:Option[Int]): Item = count.map{c =>
    Item(id, name, description, c)
  }.getOrElse{
    Item(id, name, description)
  }
}

然后你可以使用 readNullable 作为默认值,这将传递一个 Option[Int] 来应用Opt:

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

implicit val itemReads: Reads[Item] = (
  (__  "id").readNullable[Int] and
  (__  "name").read[String] and
  (__  "description").readNullable[String] and
  (__  "count").readNullable[Int]
)(Item.applyOpt _)

当然不理想,特别是如果您有几个默认字段,但是一种避免处理宏或反射的快速解决方法。

最新更新