play-json 中使用默认值

Play JSON is a powerful Scala JSON library, originally developed by the Play team for use with Play Framework. It uses Jackson for JSON parsing and has no Play dependencies.

play-json 是我在开发中经常使用的 Scala Json 库,在将 json 字符串转换成 Scala 对象时可能会遇到 json 字符串中缺失了 Scala 对象需要的成员,在这种情况下可以这么处理:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
case class Person1(name: String, age: Int, other: Option[String])
case class Person2(name: String, age: Int, other: String)

import play.api.libs.functional.syntax._
import play.api.libs.json._

implicit val person1Format = (
(JsPath \ "name").format[String] and
(JsPath \ "age").format[Int] and
(JsPath \ "other").formatNullable[String].inmap[Option[String]](x => Some(x.getOrElse("default")), y => y)
) (Person1.apply, unlift(Person1.unapply))

val str1 =
"""
|{"name":"x", "age":18}
""".stripMargin

val str2 =
"""
|{"name":"x", "age":18, "other":"test"}
""".stripMargin

println(Json.parse(str1).as[Person1])
println(Json.parse(str2).as[Person1])

implicit val person2Format = (
(JsPath \ "name").format[String] and
(JsPath \ "age").format[Int] and
(JsPath \ "other").formatNullable[String].inmap[String](_.getOrElse("default"), Some(_))
) (Person2.apply, unlift(Person2.unapply))

println(Json.parse(str1).as[Person2])
println(Json.parse(str2).as[Person2])

上面的代码会输出:

1
2
3
4
Person1(x,18,Some(default))
Person1(x,18,Some(test))
Person2(x,18,default)
Person2(x,18,test)

通过这种方式,从 json 字符串转换到 Scala 对象时,可以给缺失的字段添加默认值。