使用 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 处理默认值的好方法是啥的主要内容,如果未能解决你的问题,请参考以下文章

使用python / kivy处理小部件放置以解决屏幕旋转的好方法是啥?

在 Codeigniter 中处理发布数据的好方法是啥?

在 oracle 中处理逗号分隔值的好方法

spray-json JsString 对字符串值的引用

在Android中处理非常大量数据的好方法是啥?

处理一些运行时 HTTP 异常的好习惯是啥?