我有一个带有一些选项的案例类:
case class Person (
name: String,
nationality: Option[String],
email: Option[String],
gender: Option[String]
)
使用 play 2.1.3 我正在尝试创建一个如下所示的 JSON:
{"name": "Joe", "email": "[email protected]"}
对于对象:
val user = new User("Joe, None, Some("[email protected]"), Some("male"))
与:
val myJson = Json.obj("name" -> user.name,
"nationality" -> user.nationality, "email" -> user.email)
但是我得到:
{"name": "Joe", "nationality": null, "email": "[email protected]"}
如何避免JSON中值为空的国籍?
在意识到问题与 play JSON 处理相关后,我设法找到了一个解决方案,灵感来自于 我需要有关 Play 的 Json 的建议以及 Writes 特征中优雅的选项处理。我不相信这是最优雅的解决方案,但它确实有效:
def writes(person: Person): JsValue = {
JsObject(
Seq[(String, JsValue)]() ++
Some(person.name).map("name" -> JsString(_)) ++
person.email.map("email" -> JsString(_))
)
}
我知道这是一个非常晚的回复,并且不适用于原始上下文,但现在可能有用。我在 Scala 3.3.1 和 Play 3.0 中工作:
implicit val personWrites: Writes[Person] = new Writes[Person] {
def writes(o: StudentMarkRow): JsValue =
val builder = Json.newBuilder
builder += "name" -> o.name
if o.nationality.isDefined then builder += "nationality" -> o.nationality.get
if o.email.isDefined then builder += "email" -> o.email.get
if o.gender.isDefined then builder += "gender" -> o.gender.get
builder.result()
}
人们可以抽象出模式
if o.gender.isDefined then builder += "gender" -> o.gender.get
也许作为构建器特征的扩展方法。