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

时间:2013-12-17 08:57:31

标签: json scala playframework-2.0 default slick

你好,我遇到了JSON身体解析器的问题。 我的问题是以下我有一个带有一些可选参数的案例类(Option [T])和一个带有默认值的参数,我不想将其输入为Option [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]相同的行为吗?

由于

我正在使用:

  • Scala 2.10
  • Play Framework 2.2.1
  • Play-Slick插件0.5.0.8

2 个答案:

答案 0 :(得分:4)

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

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

如果你绝对不想要一个选项,你可以看一下:

Defaults for missing properties in play 2 JSON formats

答案 1 :(得分:1)

一种解决方法是编写一个apply方法,它接受count的默认值作为选项并处理构造(不能命名它,因为我们在构建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]传递给applyOpt:

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 _)

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

相关问题