您好,我在使用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 _)
当然不理想,特别是如果您有几个默认字段,但是一种避免处理宏或反射的快速解决方法。