Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/json/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/scala/18.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
播放Scala JSON正文解析器默认值字段_Json_Scala_Playframework 2.0_Default_Slick - Fatal编程技术网

播放Scala 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

您好,我在JSON主体解析器方面遇到问题。 我的问题是,我有一个带有一些可选参数(选项[T])的case类和一个带有默认值的参数,我不希望将其键入选项[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)
我是否有可能通过默认值字段实现与选项[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 _)