修改现有 Json 键:Mule

Modify Existing Json key : Mule

我的输入

{
  "Root": {
    "order": [
      {
        "locale": "en-US",
        "orderItems": [
          {
            "product": {
              "partNumber": "23853864"
            },
            "itemSpecifics": {
              "options": {
                "color": "Olive",
                "size": "S"
              },
              "actualPrice": "7",
              "customItemData": {
                "TEMP_8401": "8.95",
                "TEMP_150207": "3.00"
              }
            }
          }
        ]
      }
    ... Large amount of JSON Data ...
    ]
  }
}

预期输出

{
  "Root": {
    "order": [
      {
        "locale": "en-US",
        "orderItems": [
          {
            "product": {
              "partNumber": "23853864"
            },
            "itemSpecifics": {
              "options": {
                "color": "Olive",
                "size": "S"
              },
              "actualPrice": "7",
              "customItemData": {
                "8401": "8.95",
                "150207": "3.00"
              }
            }
          }
        ]
      }
    ... Large amount of JSON Data ...
    ]
  }
}

我想删除"customItemData"对象键中的"TEMP_",但我不想再次手动重新映射整个JSON对象,一个一个地分配属性。还有其他选择吗? DataWeave 中有更短的逻辑吗?我正在使用 Mule 3.9.0.

这使用递归和模式匹配遍历数据结构并修改键。如果密钥不包含字符串 "TEMP",则保持原样;如果包含,则根据您的要求进行修改。

%dw 1.0
%output application/json

%function applyToKeys(e, fn)
  e match {
    :array  -> $ map ((v) -> applyToKeys(v, fn)),
    :object -> $ mapObject ((v, k) -> {(fn(k)): applyToKeys(v, fn)}),
    default -> $
  }
---
applyToKeys(payload,
            ((key) -> ((key as :string) splitBy "_" )[1] 
                      when ((key as :string) contains "TEMP")
                      otherwise key))

使用这样的解决方案时请记住权衡取舍。代码当然不那么冗长,但它需要对递归、模式匹配、lambda 和高阶函数等高级概念有扎实的理解。