我正在尝试创建一个 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 新手。
要将
Book
转换为 JsObject
,您可以使用 play-json 宏,而不是手动执行:
val writes: OWrites[Book] = Json.writes[Book]
val book: Book = ???
val jsObj: JsObject = Json.toJsObject(book)