set payload 中给定 json 对象和 set payload 中给定 json 数据与输出 application/json 之间有什么区别

what is the difference between given json object in set payload and given json data in set payload with output application/json

案例一) 我将键值对中的对象直接提供给设置的有效负载,然后将其提供给 foreach,其中我有一个记录器,它只打印有效负载。

内部设置有效载荷=>

{
    "msg": {
               "status": "ok"
           },
    "msg": {
               "status": "ok2"
    }
}

案例2) 我将键值对中的对象直接提供给带有输出 appication/json 的设置有效负载,然后将其提供给 foreach,其中我有一个记录器,它只打印有效负载。

内部设置有效载荷=>

output application/json
---
{
    "msg": {
               "status": "ok"
           },
    "msg": {
               "status": "ok2"
    }
}

现在,当我 运行 第一种情况时,我在 for-each 中遇到错误,但第二种情况 运行 成功。在这两种情况下,每个配置都是相同的。

我得到的错误是=>

Foreach does not support 'java.util.Map' with no collection expression. To iterate over Map 
entries use '#[dw::core::Objects::entrySet(payload)]'

所以这里我有 3 个问题:

  • Q1)当我们给对象没有“输出application/json”时,set payload组件的默认输出是什么?

没有默认值。在 Mule 4 中,表达式语言是 DataWeave 2.x。如果缺少输出格式,DataWeave 会尝试从脚本中推断出来。它可能并不总是成功,您需要明确添加它。

  • Q2) 以上两种情况有什么区别?

请注意,您的第一个案例不是 JSON。它看起来像 JSON,但它是一个 DataWeave 脚本,没有明确的输出格式。 DataWeave 正在生成一个 Java 映射作为表示 DataWeave 对象的输出,即键值集合。

第二个也是 DataWeave,但执行 DataWeave 脚本生成的输出明确是一个 JSON 对象,媒体类型也设置为 application/json,因此以下消息处理器在流程知道他们应该如何尝试解析它。

  • Q3) for-each 也可以处理对象吗?

根据具体的实施 class 它可能会起作用,但通常假设不会。在这种情况下,第一个是不可迭代的 Map。如果您想这样做,错误消息会告诉您表达式迭代 Map 中的条目。我不太确定为什么 JSON 对象用 foreach 迭代。它可能是 JSON 解析器实现的一个特性。