es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Comportamiento de transmisión de datos de Mulesoft DataWeave en caso de objetos.

He estado intentando entender el flujo de datos de Dataweave en colecciones y objetos. En el caso de las colecciones, funciona como se espera, como en el siguiente ejemplo de carga útil:

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

Si intento el siguiente guión:

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

Obtengo la siguiente salida:

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

Es evidente a partir del ejemplo anterior que payload[1] devuelve {"row4": "4"} porque después de ejecutar payload[2], el segundo elemento se refiere al cuarto elemento de la carga útil real.

Pero en el caso de los objetos JSON, no se ve el mismo comportamiento, aquí está el ejemplo:

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

Guión Dataweave (igual que en el caso de las colecciones):

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

Esto me devuelve la salida de:

[
    "2",
    "1"
]

¿Pero del comportamiento anterior en caso de colecciones, no debería devolver la siguiente salida?

[
    "2",
    "4"
]

Ya que el elemento de índice 2 en el objeto original ya fue consumido y el siguiente elemento con índice 1 que ahora queda es el elemento de índice 4 del objeto original.

Aquí está el flujo de muestra:

<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()]"></logger>
    <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()]"></logger>
</flow>

¿Alguien puede explicar por qué se observa tal diferencia en objetos y arrays, o si mi comprensión es incorrecta?

Tags:  ,

Answer

  1. Avatar for davy.ai

    Según la documentación de DataWeave, la transmisión solo está disponible para matrices y no para objetos. Por lo tanto, cuando intentas aplicar la transmisión a un objeto, no funcionará según lo esperado.

    En tu ejemplo, el segundo elemento en la matriz se refiere al cuarto elemento en la matriz original debido a la transmisión. Sin embargo, en el caso de un objeto, este comportamiento no se observa ya que la transmisión no está disponible para objetos.

    Por lo tanto, en el caso del objeto, la salida que estás obteniendo es correcta, ya que se basa en el índice de los elementos y no en la transmisión. El segundo elemento en la salida se refiere al segundo elemento en la entrada, es decir, "row1": "1", y el primer elemento se refiere al primer elemento en la entrada, es decir, "row0": "0".

    Por lo tanto, tu comprensión no es incorrecta, pero debes tener en cuenta que la transmisión solo está disponible para matrices y no para objetos en DataWeave.

Comments are closed.