如何使用Dataweave将下面的json(可以有多个嵌套对象)转换为所需的输出?

问题描述 投票:0回答:1

输入:

     {
          "drag": {
            "misc": {
              "prog": {
                "ID": {
                  "type": "name",
                  "value": "ABC"
                },
                "ID": {
                  "type": "standard",
                  "value": "PQR"
                }
              }
            }
          },
          "peak": {
            "bird": {
              "tech": {
                "pl": {
                  "ID": {
                    "type": "room",
                    "value": "123"
                  },
                  "ID": {
                    "type": "sport",
                    "value": "football"
                  }
                }
              }
            }
          },
          "ID": {
            "type": "browser",
            "value": "google"
          },
          "ID": {
            "type": "day",
            "value": "Wednesday"
          }
        }

所需输出:

{
  "drag": {
    "misc": {
      "prog": {
        "ID": {
          "name": "ABC",
          "standard": "PQR"
        }
      }
    }
  },
  "peak": {
    "bird": {
      "tech": {
        "pl": {
          "ID": {
            "room": "123",
            "sport": "football"
          }
        }
      }
    }
  },
  "ID": {
    "browser": "google",
    "day": "Wednesday"
  }
}

总结一下需求,我需要将 ID 键与类型和值键合并。 请注意:这只是一个示例有效负载。实际有效负载可以有 n 个嵌套对象。但是,ID 将具有相同的键,即类型和值。手动构建有效负载不是一种选择。

json mule dataweave mulesoft anypoint-studio
1个回答
0
投票

使用递归函数映射所有对象,如果一个元素具有名称为“ID”的所有键,那么我们将它们映射到具有键值“合并”的单个“ID”元素。如果不是,我们只是递归地将相同的逻辑应用于其子元素。除

Object
之外的所有类型均保持原样。

%dw 2.0
import * from dw::core::Arrays
output application/json 

fun mapProg(x, idKeyname) =
  x match {
    case o is Object -> if (namesOf(o) every ($ == idKeyname))
      {
        ID: o mapObject (
          ($.'type'): $.value
        )
      }
    else
      (o mapObject ($$): mapProg($, idKeyname)) // recursively map child elements
    else -> x
  }
---
mapProg(payload, "ID")

输出:

{
  "drag": {
    "misc": {
      "prog": {
        "ID": {
          "name": "ABC",
          "standard": "PQR"
        }
      }
    }
  },
  "peak": {
    "bird": {
      "tech": {
        "pl": {
          "ID": {
            "room": "123",
            "sport": "football"
          }
        }
      }
    }
  },
  "ID": {
    "type": "browser",
    "value": "google"
  },
  "ID": {
    "type": "day",
    "value": "Wednesday"
  }
}
© www.soinside.com 2019 - 2024. All rights reserved.