播放 json 在这种情况下看起来效果不佳
Play json looking not working well in this case
我有以下代码可用于播放 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)
}
}
案例 class A1 的默认值为 x
,即 Some (1)
。
当我解析 {"y":"xyz"}
时,结果是 A1(None,Some(xyz))
,我认为这里应该使用默认值,结果应该是 A1(Some(1),Some(xyz))
这是一个错误吗?或者我该如何解决这个问题
Json.reads
是一个 scala 宏,它的实现不关心默认值,因为它只遍历所有 class' 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
}
}
}
我有以下代码可用于播放 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)
}
}
案例 class A1 的默认值为 x
,即 Some (1)
。
当我解析 {"y":"xyz"}
时,结果是 A1(None,Some(xyz))
,我认为这里应该使用默认值,结果应该是 A1(Some(1),Some(xyz))
这是一个错误吗?或者我该如何解决这个问题
Json.reads
是一个 scala 宏,它的实现不关心默认值,因为它只遍历所有 class' 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
}
}
}