【问题标题】:Mulesoft dataweave streaming behaviour in case of objects对象情况下的 Mulesoft 数据编织流式传输行为
【发布时间】:2022-01-05 12:44:30
【问题描述】:

我一直在尝试了解案例集合和对象中的数据编织流。在收集的情况下,它可以按预期工作,例如在下面的paylod中

[
    {"row0" : "0"},
    {"row1" : "1"},
    {"row2" : "2"},
    {"row3" : "3"},
    {"row4" : "4"}
]  

如果我尝试以下脚本

%dw 2.0
input payload application/json
output application/json deferred=true
---
[payload[2] , payload[1]]

我得到以下输出

[
    {
        "row2": "2"
    },
    {
        "row4": "4"
    }
]

从上面的例子可以看出payload[1]返回{ "row4": "4" },因为在执行payload[2]之后,第二个元素指的是实际有效载荷的第四个元素。

但是在 Json 对象的情况下没有看到相同的行为,这里是示例

输入负载

{
  "row0" : "0",
  "row1" : "1",
  "row2" : "2",
  "row3" : "3",
  "row4" : "4"
}

dataweave 脚本(与收集时使用的脚本相同)

%dw 2.0
input payload application/json
output application/json deferred=true
---
[payload[2] , payload[1]]

这将输出返回给我

[
    "2",
    "1"
]

但是从之前收集的情况来看,它不应该返回以下输出吗?

[
    "2",
    "4"
]

因为原始对象中的第 2 个索引元素已经被消耗,并且现在剩余的下一个索引为 1 的元素是原始对象的第 4 个索引元素

这里是示例流程


<flow name="streamingFlowObjects" doc:id="c5f23756-5083-4a7d-a173-edad1ad69c75" >
        <http:listener doc:name="Listener" doc:id="4bfde9f0-27ee-4e77-8c7a-4be0ffe8f488" config-ref="HTTP_Listener_config" path="/sync" outputMimeType="application/json; streaming=true">
        </http:listener>
        <logger level="INFO" doc:name="Logger" doc:id="c1bb4dde-c965-4d92-bb06-5e4fd2ae2166" message="#[output application/json --- 'Started ' ++ now()]"/>
        <ee:transform doc:name="Transform Message" doc:id="1fe3dda6-9aa7-4948-9c77-d8ec033ec029" >
            <ee:message >
                <ee:set-payload ><![CDATA[%dw 2.0
input payload application/json
output application/json deferred=true
---
[payload[1] , payload[0]]]]></ee:set-payload>
            </ee:message>
        </ee:transform>
        <logger level="INFO" doc:name="Logger" doc:id="31033cc4-1827-4960-9c64-588bda1989cf" message="#[output application/json --- 'Completed ' ++ now()]"/>
    </flow>

谁能解释为什么在对象和数组中观察到这种差异,或者我的理解不正确。

【问题讨论】:

    标签: dataweave mulesoft


    【解决方案1】:

    首先让我们记住streaming in DataWeave的一些定义:

    • 流的基本单位特定于数据格式。 单位是 CSV 文档中的一条记录、JSON 文档中的数组元素或 XML 文档中的集合。
    • 流按顺序访问流的每个单元。 流式传输不支持对文档的随机访问。

    然后让我们注意,虽然您在两种情况下都使用了索引选择器,但这并不意味着数据被转换为可流式集合。这只意味着执行了某种索引访问。

    很明显,第一种情况是有效载荷,它是一个数组,作为流访问。然后你可以看到消费流的副作用。知道这可能发生是有趣且有用的。

    第二种情况是单个对象,索引访问只是从同一个对象返回元素,这是工作单元,因此不可流。索引选择器表现为“对文档的随机访问”。这就是行为不同的原因。

    【讨论】:

    • 我检查了文档,有一个部分用于流式传输 json docs.mulesoft.com/dataweave/2.4/dataweave-streaming#stream_json 在这种情况下,年龄在家庭之前访问(这里家庭发生在年龄之前)并且由于 Dataweave 无法向后退,因此无法访问其书面系列,我尝试进行此演示,发现我得到了 {'a': 37, 'b':[]} 但根据您的评论,我应该得到数组b 中的值不是空数组。我这里的理解是json对象中的每个键值对都是流的单位
    猜你喜欢
    • 1970-01-01
    • 2015-06-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-19
    • 1970-01-01
    • 2014-06-29
    相关资源
    最近更新 更多