在这种情况下玩json看起来效果不佳

时间:2017-08-14 05:40:21

标签: scala playframework playframework-2.0

我有以下代码可以使用play json

导入play.api.libs.json.Json

trait A {
  def x: Option[Int]

  def y: Option[String]
}

case class A1(x: Option[Int] = Some(1), y: Option[String]) extends A

object PlayJsonBug {
  def main(args: Array[String]): Unit = {
    implicit val A1Reader = Json.reads[A1]
    implicit val A1Writer = Json.writes[A1]
    val str = """{"y":"xyz"}"""
    val a: A1 = Json.fromJson[A1](Json.parse(str)).get
    println(a)
  }


}

案例类A1具有x的默认值Some (1)。 当我解析{"y":"xyz"}时,结果是A1(None,Some(xyz)),我认为应该在这里使用默认值,即tis,结果应为A1(Some(1),Some(xyz))

这是一个错误吗?或者我如何解决这个问题

1 个答案:

答案 0 :(得分:5)

Json.reads是一个scala宏,其实现不关心默认值,因为它只迭代所有类的case访问器。您需要实现自己的play.api.libs.json.Reads以支持在未在json中找到值时回退到默认参数。

它可能看起来像这样(对于Play 2.5.x):

implicit object A1Reads extends Reads[A1] {

    private val generatedReads = Json.reads[A1]

    override def reads(json: JsValue): JsResult[A1] = {
        // re-use reads, but replace None for x with default param
        generatedReads.reads(json).map {
            case A1(None, y) => A1(Some(1), y)
            case valid => valid
        }
    }
}