修改现有的Json密钥:M子

时间:2018-08-10 19:05:37

标签: mule dataweave

我的输入

{
  "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 ...
    ]
  }
}

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

1 个答案:

答案 0 :(得分: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和更高阶函数等高级概念有深入的了解。