json - 如何使用 JSON 转换器在 Play 上展平 js 数组?

标签 json scala playframework

我有以下格式的 Json:

  {
    "user": {
      "id": "1",
      "name": "Some User",
      "permGroups": [
        {
          "id": "group1",
          "name": "Group 1",
          "actions": [
            {
              "id": "action1",
              "name": "Action 1"
            }
          ]
        },
        {
          "id": "group2",
          "name": "Group 2",
          "actions": [
            {
              "id": "action2",
              "name": "Action 2"
            },
            {
              "id": "action3",
              "name": "Action 3"
            }
          ]
        }
      ]
    },
    "title": "New Role",
    "role_id": "56fea66c"
  }

如何在 Play 中制作 JSON 转换器! 2.1,这将把它变成:

{
 "name": "New Role",
 "id" : "56fea66c",
 "permGroupIds": ["group1","group2"]
 "actions": ["action1", "action2", "action3"]
}

到目前为止我已经完成了这个工作:

import play.api.libs.json._
import play.api.libs.functional.syntax._
import play.api.libs.json.Reads._

val jsonStr = """{"user":{"id":"1","name":"Some User","permGroups":[{"id":"group1","name":"Group 1","actions":[{"id":"action1","name":"Action 1"}]},{"id":"group2","name":"Group 2","actions":[{"id":"action3","name":"Action 3"},{"id":"action3","name":"Action 3"}]}]},"title":"New Role","role_id":"56fea66c"}"""
val jsonVal = Json.parse(jsonStr)

val jsonTransformer = (
    (__ \ 'name).json.copyFrom((__ \ 'title).json.pick) and
    (__ \ 'id).json.copyFrom((__ \ 'role_id).json.pick)
  ).reduce

jsonVal.transform(jsonTransformer)

这会产生:

{
 "name": "New Role",
 "id" : "56fea66c",
}

最佳答案

这是一种方法。这将忽略任何没有 ID 的 Perm 组或操作。

import play.api.libs.json._
import play.api.libs.json.Reads._
import play.api.libs.functional.syntax._

val jsonStr = """{"user":{"id":"1","name":"Some User","permGroups":[{"id":"group1","name":"Group 1","actions":[{"id":"action1","name":"Action 1"}]},{"id":"group2","name":"Group 2","actions":[{"id":"action3","name":"Action 3"},{"id":"action3","name":"Action 3"}]}]},"title":"New Role","role_id":"56fea66c"}"""

val jsonTransformer = (
  (__ \ 'name).json.copyFrom((__ \ 'user \ 'name).json.pick) and
  (__ \ 'id).json.copyFrom((__ \ 'role_id).json.pick) and
  (__ \ 'permGroupIds).json.copyFrom((__ \ 'user \ 'permGroups).read[List[JsObject]].map(permGroups =>
    JsArray(permGroups.flatMap(permGroup => (permGroup \ "id").toOption))
  )) and
  (__ \ 'actions).json.copyFrom((__ \ 'user \ 'permGroups).read[List[JsObject]].map(permGroups =>
    JsArray(permGroups.flatMap(permGroup => (permGroup \ "actions").asOpt[JsArray]).flatMap(_ \\ "id"))
  ))
).reduce

val transformed = Json.parse(jsonStr).transform(jsonTransformer)
Json.prettyPrint(transformed.get)

这会产生

{
  "name" : "Some User",
  "id" : "56fea66c",
  "permGroupIds" : [ "group1", "group2" ],
  "actions" : [ "action1", "action3", "action3" ]
}

关于json - 如何使用 JSON 转换器在 Play 上展平 js 数组?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21907451/

相关文章:

javascript - 如何从解析的 JSON 数据中获取特定值?

Javascript:使用额外的花括号解析 JSON

scala - 如何在 x :Myclass => Boolean to get the conjunction? 的列表中使用左折叠

java - Hibernate - 简单查询延迟获取

playframework - 是否可以使用 play framework 2 美化 scala 模板?

html - 从 wcf 服务返回 html

json - 从JSON数组中选择一个特定的值

scala - Scala 中 Groovy 的 classX.metaClass.getProperty

playframework - 执行 Play 运行时 Play Framework 报错java.lang.NoSuchMethodError

json解码嵌入式结构