使用 play Framework 2.1 的 JsObject 中的 Option 为空值

问题描述 投票:0回答:2

我有一个带有一些选项的案例类:

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中值为空的国籍?

json scala playframework-2.1
2个回答
4
投票

在意识到问题与 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(_))
  )
}

0
投票

我知道这是一个非常晚的回复,并且不适用于原始上下文,但现在可能有用。我在 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
也许作为构建器特征的扩展方法。

© www.soinside.com 2019 - 2024. All rights reserved.