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

时间:2013-04-01 09:32:04

标签: scala spray spray-json

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

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缺少值。

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

3 个答案:

答案 0 :(得分:8)

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

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

更新:PR已更新且仍处于打开状态https://github.com/spray/spray-json/pull/93

答案 1 :(得分: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)会起作用。

答案 2 :(得分: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)
  }
}