更新Json对象

时间:2014-06-26 02:05:54

标签: json scala playframework-2.0

我有一个需要更新的json对象。原始对象是一个如下所示的列表:

[
  {
    "firstName":"Jane",
    "lastName":"Smith"
  },
  {
    "firstName":"Jack",
    "lastName":"Brown"
  }
]

对于列表中的每个元素,我们有一个额外的字段" age",需要在运行时添加,因此结果应如下所示:

[
  {
    "firstName":"Jane",
    "lastName":"Smith",
    "age": "21"
  },
  {
    "firstName":"Jack",
    "lastName":"Brown",
    "age": "34"
  }
]

有关如何执行此操作的任何建议,结果仍然是json?

感谢。

2 个答案:

答案 0 :(得分:1)

request.body.asJson.map {
  jm => (jm.as[JsObject] ++ Json.obj("age" -> 123))
}

答案 1 :(得分:0)

我建议将收到的JSON数组反序列化为List个案例类,然后让一些函数根据案例类的当前属性填充缺少的属性,最后将它们序列化为JSON并提供服务回应。

让我们创建一个Person案例类,其中包含将丢失为Option的字段:

import play.api.libs.json.Json

case class Person(firstName: String, lastName: String, age: Option[Int])

object Person {
    implicit val format: Format[Person] = Json.format[Person]

    def addAge(person: Person): Person = {
        val age = ... // however you determine the age
        person.copy(age = Some(age))
    }
}

Person的伴随对象中,我还使用format宏定义了一个JSON序列化器/反序列化程序,并为一个找到一个人年龄的函数存根,然后将其复制回person并将其退回。

在网络服务电话的深处,你可能会有这样的事情:

val jsArray = ... // The JsValue from somewhere

jsArray.validate[List[Person]].fold(
    // Handle the case for invalid incoming JSON
    error => InternalServerError("Received invalid JSON response from remote service."),
    // Handle a deserialized array of List[Person]
    people => {
        Ok(
            // Serialize as JSON, requires the implicit `format` defined earlier.
            Json.toJson(
                // Map each Person to themselves, adding the age
                people.map(person => Person.addAge(person))
            )
        )
    }
)

这个方法更安全,否则你必须逐个从数组中提取值并连接对象,这是非常尴尬的。当您收到的JSON缺少您期望的字段时,这也可以让您轻松处理错误。