【问题标题】:DWL formatting in mule 4mule 4 中的 DWL 格式
【发布时间】:2022-12-26 05:22:08
【问题描述】:

我有以下 JSON 作为输入:

[
    {
        "abc: {
            "s": "123"
        },
        "pqr": {
            "s": "234"
        },
        "xyz": {
            "s": "345"
        }
    },
     {
        "abc: {
            "s": "456"
        },
        "pqr": {
            "s": "567"
        }
    }
]

我的预期输出是:

[
    {
        "abc: "123",
        "pqr": "234",
        "xyz": "345"
    },
     {
        "abc: "456",
        "pqr": "567",
        "xyz": null
    }
]

我怎样才能在 mule 4 中实现这一点?请建议。

注意:JSON 对象键是动态的。在示例输入中,可以看到 3 个键。但是,根据来自其他 API 的输入负载,可以有更多键,即 abc、def、pqr、mno、xyz 等。

【问题讨论】:

  • 内部密钥总是“s”吗?
  • 第一条记录是否总是包含所有键?还是您有所有键的单独列表?
  • 嗨@HarshankBansal,不,内部键基本上表示字符串的“s”。它可以是数字、列表等。所以,它不会总是's'。
  • 嗨@aled,第一条记录可能始终包含也可能不包含所有键。密钥在有效负载主体中传递,例如“abc、pqr、xyz、....、mno、def ..”。
  • 您的意思是数组中的每条记录的键可能不同,并且它们并不都位于有效负载中的全局位置,但您需要输出的每条记录中的所有键?

标签: dataweave mulesoft mule4


【解决方案1】:

您可以使用 mapObject 动态更新数组的每个元素。如果 main 值的 JSON 始终只有一个字段,则可以使用其索引 [0] 获取它。

为了确保获得每个对象中的所有键,您必须首先获取所有键并围绕它编写脚本。

%dw 2.0
var allFields = payload flatMap keysOf($) distinctBy ($)
output application/json  
---
payload map ((nestedJson) -> 
    allFields reduce ((field, acc = {}) -> {
        (acc),
        (field): (nestedJson[field])[0]
    })
)

【讨论】:

  • 嗨 Harshank,首先,感谢您的解决方案。内部键基本上表示字符串的“s”。它可以是数字,列表等。所以,它不会总是's',消除了我们不能做'(key):valueWithS.s'的事实。也就是说,第一条记录中存在的键“xyz”不存在于输入的第二条记录中。因此,在输出的第二条记录中,它应该显示为“xyz:null”,这在您提供的解决方案中不存在。 [{“abc”:“123”,“pqr”:“234”,“xyz”:“345”},{“abc”:“456”,“pqr”:“567”}]
  • 好的。所以它并不总是“s”,但它总是一个键吗?
  • 这按预期工作!非常感谢您的解决方案和帮助。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-02-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多