在 Scala 中转换 JsObject:如何使用可选字段?

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

我正在尝试创建一个 scala 函数,将 JsObject 转换为具有不同结构的函数。

所有值都是可选的,因此如果它们没有出现在输入对象上,函数不应抛出错误。

我有以下代码,当我在查找中使用

.as[String]
而不是
asOpt
时,它可以工作,但我不知道如何让它与可选字段一起使用。我不确定在创建输出对象时如何从 Option 进行转换:

val input = Json.obj(
    "title" -> "a book",
    "author" -> Json.obj("name" -> "mr smith"),
    "metadata" -> Json.obj("published" -> 10983920189403L))

case class Book(title: Option[String], author: Option[String], published: Option[Long])

  def bookConvertor(inputObject: JsObject): JsObject = {
    Try {
      val title = (inputObject \ "title").asOpt[String]
      val author = (inputObject \ "author" \ "name").asOpt[String]
      val published = (inputObject \ "metadata" \ "published").asOpt[Long]
      Book(title, author, published)
    } match {
      case Success(book) => {
        JsObject(
          Seq(
            "title" -> JsString(book.title),
            "author" -> JsString(book.author),
            "published" -> JsString(book.published)
          )
        )
      }
    }
  }

任何帮助都会很棒。我是 Scala 新手。

scala playframework play-json
1个回答
0
投票

要将

Book
转换为
JsObject
,您可以使用 play-json 宏,而不是手动执行:

val writes: OWrites[Book] = Json.writes[Book]

val book: Book = ???
val jsObj: JsObject = Json.toJsObject(book)
© www.soinside.com 2019 - 2024. All rights reserved.