【问题标题】:Play Scala JSON body parser default value field播放 Scala JSON 正文解析器默认值字段
【发布时间】:2014-01-04 22:56:14
【问题描述】:

您好,我在使用 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
  • 播放框架 2.2.1
  • Play-Slick 插件 0.5.0.8

【问题讨论】:

    标签: json scala playframework-2.0 default slick


    【解决方案1】:

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

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

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

    Defaults for missing properties in play 2 JSON formats

    【讨论】:

    • 嗨,谢谢,我宁愿没有选项。至于你提供的链接。用户说他目前的解决方案有一些缺点,我必须说我同意。但是,如果没有建议更好的解决方案,我最终会使用他的方法,因为我看不到解决办法
    • 最好的解决方案是编写一个宏来自动创建 withDefault,虽然这是一项艰巨的任务:(
    【解决方案2】:

    一种解决方法是编写一个 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] 传递给 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 _)
    

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

    【讨论】:

    • 是的,但我希望避免使用所有字段编写 Reader,因为它有很多具有相同场景的案例类,但更多字段编写起来很乏味,并且在模型还不是 100 时容易出错% 稳定,你需要更新它,我希望它可以像 Jackson 在 Java 中那样开箱即用
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-05-03
    • 1970-01-01
    • 1970-01-01
    • 2019-10-14
    • 1970-01-01
    相关资源
    最近更新 更多