首页 > 解决方案 > 无法使用 JOLT 正确转换嵌套数组

问题描述

我正在尝试转换 json 嵌套数组的元素并且无法获得预期的结果,要么我正确地获取了 name 元素或 schemaExtensions 元素,但无法将两者结合在一起。

这是我的输入:

{
  "rows": [
    {
      "content": {
        "name": {
          "content": "User"
        },
        "schemaExtensions": {
          "content": [
            {
              "content": {
                "schema": {
                  "content": "User"
                },
                "required": {
                  "content": true
                }
              }
            }
          ]
        }
      }
    }
  ]
}

和 JOlt 规范定义:

  [
    {
      "operation": "shift",
      "spec": {
        "rows": {
          "*": {
            "content": {
              "name": {
                "content": "[&3].name"
              },
              "schemaExtensions": {
                "content": {
                  "*": {
                    "content": {
                      "schema": {
                        "content": "schemaExtensions.[&7].schema"
                      },
                      "required": {
                        "content": "schemaExtensions.[&7].required"
                      }
                    }
                  }
                }
              }
            }
          }
        }
      }
    }
]

预期结果:

[ {
  "name" : "User",
  "schemaExtensions": [ {
       "schema":"User",
       "required":true
    }]
}]

这是我在规范中同时拥有两者时得到的结果

[ {
  "name" : "User"
} ]

如果我从规范中删除名称,那么我会正确获得我的 schemaExtensions:

{
  "schemaExtensions" : [ {
    "schema" : "urn:ietf:params:scim:schemas:extension:enterprise:2.0:User",
    "required" : true
  } ]
}

标签: arraysjsonjolt

解决方案


name在显式编写分支( & )之前,您可以从三层嵌套开始漫游schemaExtensions。无需编写其他键名,例如

[
  {
    "operation": "shift",
    "spec": {
      "*": {
        "*": {
          "*": {
            "name": { "*": "&1" },
            "schemaExtensions": {
              "*": {
                "*": { "*": { "*": { "*": "&5.&1" } } }
              }
            }
          }
        }
      }
    }
  }
]

推荐阅读