我有一个需要更新的json对象。原始对象是一个如下所示的列表:
[
{
"firstName":"Jane",
"lastName":"Smith"
},
{
"firstName":"Jack",
"lastName":"Brown"
}
]
对于列表中的每个元素,我们有一个额外的字段" age",需要在运行时添加,因此结果应如下所示:
[
{
"firstName":"Jane",
"lastName":"Smith",
"age": "21"
},
{
"firstName":"Jack",
"lastName":"Brown",
"age": "34"
}
]
有关如何执行此操作的任何建议,结果仍然是json?
感谢。
答案 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缺少您期望的字段时,这也可以让您轻松处理错误。