6

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

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.

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

4

3 回答 3

8

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

https://github.com/spray/spray-json/pull/56

更新:PR 已更新并仍然打开https://github.com/spray/spray-json/pull/93

于 2013-05-19T12:11:26.623 回答
3

我从未使用过喷雾剂,但这是我对可能起作用的猜测:

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)会起作用。

于 2013-04-01T18:08:38.740 回答
0

我为同一问题找到的解决方法是实现我自己的 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)
  }
}
于 2019-10-16T14:36:29.327 回答