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

Joh*_*son 5 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"
  }
Run Code Online (Sandbox Code Playgroud)

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

{
 "name": "New Role",
 "id" : "56fea66c",
 "permGroupIds": ["group1","group2"]
 "actions": ["action1", "action2", "action3"]
}
Run Code Online (Sandbox Code Playgroud)

到目前为止我有这个工作:

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)
Run Code Online (Sandbox Code Playgroud)

这会产生:

{
 "name": "New Role",
 "id" : "56fea66c",
}
Run Code Online (Sandbox Code Playgroud)

jte*_*sch 1

这是一种方法。这将忽略任何没有 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)
Run Code Online (Sandbox Code Playgroud)

这会产生

{
  "name" : "Some User",
  "id" : "56fea66c",
  "permGroupIds" : [ "group1", "group2" ],
  "actions" : [ "action1", "action3", "action3" ]
}
Run Code Online (Sandbox Code Playgroud)