播放Scala JSON正文解析器默认值字段
您好,我在JSON主体解析器方面遇到问题。 我的问题是,我有一个带有一些可选参数(选项[T])的case类和一个带有默认值的参数,我不希望将其键入选项[T] 然而,当解析一个省略了默认值的字段的JSON主体时,我得到了一个错误播放Scala JSON正文解析器默认值字段,json,scala,playframework-2.0,default,slick,Json,Scala,Playframework 2.0,Default,Slick,您好,我在JSON主体解析器方面遇到问题。 我的问题是,我有一个带有一些可选参数(选项[T])的case类和一个带有默认值的参数,我不希望将其键入选项[T] 然而,当解析一个省略了默认值的字段的JSON主体时,我得到了一个错误 play.api.libs.JsError /count error path missing 这是我的控制器代码: object MyController extends Controller{ implicit val itemWrites = Json.w
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)
我是否有可能通过默认值字段实现与选项[T]相同的行为
谢谢
我正在使用:
- Scala 2.10
- 播放框架2.2.1
- 播放Slick插件0.5.0.8
差不多了。可以使用如下选项定义默认值:
case class Item( description:Option[String] = Some("String"))
如果您确实不想要一个选项,您可以在这里查看:
一种解决方法是编写一个apply方法,该方法将默认值count作为一个选项,并处理构造(不能将其命名为apply,因为我们在构建Reads时需要一个明确的名称): 然后可以使用readNullable作为默认值,这将向applyOpt传递选项[Int]:
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 _)
当然不是很理想,特别是如果您有几个默认字段,但是有一个快速的解决方法,可以避免处理宏或反射。您好,谢谢,我宁愿没有选择。至于你提供的链接。用户表示他当前的解决方案有一些缺点,我必须说我同意。但是,如果没有更好的解决方案,我将使用他的方法,因为我看不到解决方法。最好的解决方案是编写一个宏来自动创建withDefault,尽管这是一项非常重要的任务:(是的,但我希望避免编写包含所有字段的阅读器,因为有很多案例类具有相同的场景,但更多的字段编写起来很繁琐,并且容易出错。当模型还不是100%稳定时,您需要更新它,我希望它能像Jackson在Java中那样开箱即用
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 _)