你好,我遇到了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]相同的行为吗?
由于
我正在使用:
答案 0 :(得分:4)
几乎。您可以使用以下选项定义默认值:
case class Item( description:Option[String] = Some("String"))
如果你绝对不想要一个选项,你可以看一下:
答案 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 _)
当然不理想,特别是如果你有几个默认字段,但是快速的解决方法可以避免处理宏或反射。