Scala 使用spray json处理默认值的好方法是什么

Scala 使用spray json处理默认值的好方法是什么,scala,spray,spray-json,Scala,Spray,Spray Json,在某些情况下,默认值比case类中的可选值更有意义: case class Car(numberOfWheels:Int = 4, color:String) case class Car(numbeOfWheels:Option[Int], color:String) //silly 在第一种情况下,我希望能够轻松地将以下json转换为实例: {"color":"red"} 但是对于标准的jsonFormat2(Car),spray json抱怨numberOfWheels缺少值 我如何

在某些情况下,默认值比case类中的可选值更有意义:

case class Car(numberOfWheels:Int = 4, color:String)

case class Car(numbeOfWheels:Option[Int], color:String) //silly
在第一种情况下,我希望能够轻松地将以下json转换为实例:

{"color":"red"}
但是对于标准的
jsonFormat2(Car)
,spray json抱怨
numberOfWheels
缺少值


我如何才能最干净地解决这个问题?

我从未使用过喷雾,但以下是我对什么可能有效的猜测:

case class Car(numberOfWheels: Int, color: String) {
  def this(color: String) = this(4, color)
}

object Car {
  def apply(color: String) = new Car(color)
}

也许现在
jsonFormat1(Car)
可以用了。

我偶然发现了同样的问题。我已经创建了一个补丁来解决这个问题。它使具有默认值的字段成为可选字段


更新:PR已更新且仍处于打开状态

我为同一问题找到的修复方法是实现我自己的jsonFormat:

implicit object carFormat extends JsonFormat[Car] {
  def write(car: Car): JsObject = {
    val fields = List(
      ("numberOfWheels" -> JsNumber(car.numberOfWheels)),
      ("color" -> JsString(car.color))
    )
    JsObject(fields: _*)
  }

  def read(json: JsValue): Car = {
    val numberOfWheels = fromField[Option[Int]](json, "numberOfWheels")
    val color = fromField[String](json, "color")
    Car(numberOfWheels.getOrElse(4), color)
  }
}

感谢您的建议,但不幸的是,这并没有那么简单。如果您通过执行
jsonFormat1(Car.apply)
将spray json指向正确的应用函数,这将起作用。已经有一段时间了,PR已经更新:。希望我们不必再等两年,又过了两年。仍未合并:(