使用 spray-json 处理默认值的好方法是啥
Posted
技术标签:
【中文标题】使用 spray-json 处理默认值的好方法是啥【英文标题】:What is a good way to handle default values with spray-json使用 spray-json 处理默认值的好方法是什么 【发布时间】:2013-03-22 09:05:25 【问题描述】:在某些情况下,默认值比案例类中的可选值更有意义:
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
的缺失值。
如何最干净地解决这个问题?
【问题讨论】:
【参考方案1】:我为同一问题找到的解决方法是实现我自己的 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)
【讨论】:
【参考方案2】:我偶然发现了同样的问题。我已经创建了一个可以为我解决它的补丁。它使具有默认值的字段成为可选的。
https://github.com/spray/spray-json/pull/56
更新:PR 已更新且仍处于打开状态https://github.com/spray/spray-json/pull/93
【讨论】:
好久不见,公关更新了:github.com/spray/spray-json/pull/93。希望我们不必再等 2 年。 又过了 2 年。仍然没有合并:(【参考方案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)
会起作用。
【讨论】:
感谢您的建议,但不幸的是,事情并没有那么简单。 如果您通过jsonFormat1(Car.apply)
将 spray-json 指向正确的应用函数,这将起作用。以上是关于使用 spray-json 处理默认值的好方法是啥的主要内容,如果未能解决你的问题,请参考以下文章