Scala Play框架'更新' json数组

时间:2015-12-03 14:36:05

标签: json scala parsing playframework-2.0

假设我有一个看起来像这样的json数组(我从远程服务接收它):

[{"id": 1}, {"id": 2}, ... , {"id": 10}]

而且,比方说,我希望改变'就像这样(将100添加到' id' s和其他值):

[{"id": 101}, {"id": 102}, ..., {"id": 110} ]

至于初学者,我想更新'这样它至少会用空白数组替换初始数组(只是为了测试它是如何工作的)。

Json.parse("""[{"id": 1}, {"id": 2}]""").transform( (__).json.update( __.read[JsArray].map(_ => JsArray()) ))

但它引发了一个例外:

play.api.libs.json.JsResult[play.api.libs.json.JsObject] = JsError(List((,List(ValidationError(List(error.expected.jsobject),WrappedArray())))))

然而,如果它们被密封在json对象内部,那么它有点工作:

Json.parse("""{"ids": [{"id": 1}, {"id": 2}]}""").transform( (__ \ "ids").json.update( __.read[JsArray].map(_ => JsArray()) ))

导致

play.api.libs.json.JsResult[play.api.libs.json.JsObject] = JsSuccess({"ids":[]},/ids)

如何处理数组json? 提前致谢

1 个答案:

答案 0 :(得分:2)

请尝试以下代码

case class ID(id: Int)
implicit val reads = Json.reads[ID]

Json.parse("""[{"id": 1}, {"id": 2}]""").as[JsArray].value.map(_.transform(__.json.update {
  __.read[ID].map { case x: ID => Json.obj("id" -> (x.id + 100)) }
}))