在某些情况下,默认值比案例类中的选项更有意义:
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
缺少值。
我如何最干净地解决这个问题?
答案 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)
}
}