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.

Iteración de Matriz JSON – Travesía de Árbol en Mulesoft

JSON de entrada:

{
    "id": "/",
    "code": "/",
    "typeCode": "CPC",
    "timeStamp": "2021-11-16T17:00:00-06:00",
    "childList": [
        {
            "id": "577-1-1",
            "code": "1111",
            "name": "Electronics-1-1",
            "displayName": "Electronics-1-1",
            "active": true,
            "languageCode": "en",
            "typeCode": "CPC",
            "childList": [
                {
                    "id": "579-2-1",
                    "code": "2222",
                    "name": "Calculators-2-1",
                    "displayName": "Calculators-2-1",
                    "active": true,
                    "languageCode": "en",
                    "typeCode": "CPC",
                    "childList": []
                },
                {
                    "id": "509-2-2",
                    "code": "3333",
                    "name": "Oven-2-2",
                    "displayName": "Oven-2-2",
                    "active": true,
                    "languageCode": "en",
                    "typeCode": "CPC",
                    "childList": [
                        {
                            "id": "749-3-1",
                            "code": "4444",
                            "name": "MicroOven-3-1",
                            "displayName": "MicroOven-3-1",
                            "active": true,
                            "languageCode": "en",
                            "typeCode": "CPC",
                            "childList": []
                        }
                    ]
                }
            ]
        },
        {
            "id": "549-1-2",
            "code": "5555",
            "name": "Refrigerator-1-2",
            "displayName": "Refrigerator-1-2",
            "active": true,
            "languageCode": "en",
            "typeCode": "CPC",
            "childList": []
        }
    ]
}
  1. Y el XML esperado es el siguiente: – Aquí se debe tener en cuenta el categoryPath para la dirección completa del childElement y agruparlo en el childList del primer padre
  2. No sabremos los elementos secundarios exactos de ninguna matriz, es decir, puede haber ‘n’ número de childList dentro de un childList
  3. Si el elemento childList es una matriz vacía, debemos hacer la asignación al xml y detenerla, de lo contrario, proceder dentro de esa matriz y hacer la asignación para esos elementos secundarios

Transformación XML:

<Category CategoryId="${childList.id}" CategoryPath="${childList.code}/${childList.childList.code}" Description="${childList.name}" ShortDescription="${childList.displayName}">
    <Extn ExtnSyncTS="${headers.timeStamp}"/>
</Category>

XML esperado:

<CategoryListArray>
    <CategoryList>
      <Category CategoryId="577-1-1" CategoryPath="1111" Description="Electronics-1-1" ShortDescription="Electronics-1-1">
        <Extn ExtnSyncTS="2021-11-16T17:00:00-06:00"/>
      </Category>
      <Category CategoryId="579-2-1" CategoryPath="1111/2222" Description="Calculators-2-1" ShortDescription="Calculators-2-1">
        <Extn ExtnSyncTS=" "/>
      </Category>
      <Category CategoryId="509-2-2" CategoryPath="1111/3333" Description="Oven-2-2" ShortDescription="Oven-2-2">
        <Extn ExtnSyncTS="2021-11-16T17:00:00-06:00"/>
      </Category>
      <Category CategoryId="749-3-1" CategoryPath="1111/3333/4444" Description="MicroOven-3-1" ShortDescription="MicroOven-3-1">
        <Extn ExtnSyncTS="2021-11-16T17:00:00-06:00"/>
      </Category>
</CategoryList>
<CategoryList>
      <Category CategoryId="549-1-2" CategoryPath="5555" Description="Refrigerator-3-1" ShortDescription="Refrigerator-3-1">
        <Extn ExtnSyncTS="2021-11-16T17:00:00-06:00"/>
      </Category>
    </CategoryList>
</CategoryListArray>
Tags:  , , , ,

Answer

  1. Avatar for davy.ai

    Transformación de JSON a XML usando Mule4

    Enunciado del problema

    Queremos transformar los datos JSON dados a XML con las siguientes condiciones:

    1. Si el elemento childList es una matriz vacía, debemos hacer el mapeo a XML y detenernos; de lo contrario, procedemos dentro de esa matriz y hacemos el mapeo para esos elementos hijos.
    2. Necesitamos transformar los datos JSON al formato XML como se muestra a continuación:

        <categorylistarray>
            <categorylist>
              <category categoryid="${childList.id}" categorypath="${childList.code}/${childList.childList.code}" description="${childList.name}" shortdescription="${childList.displayName}">
                <extn extnsyncts="${headers.timeStamp}"></extn>
              </category>
            </categorylist>
        </categorylistarray>
    

    Solución

    Para resolver el problema dado, primero debemos analizar la cadena JSON entrante en un objeto JSON. Una vez obtenido el objeto, verificaremos si childList es una matriz vacía. Si la matriz no está vacía, iteramos a través de cada uno de los elementos de childList y llamamos recursivamente a la función de transformación para cada elemento. Si la matriz está vacía, mapeamos ese nodo en particular al XML según la estructura dada.

    La función de transformación utilizada aquí está escrita en Dataweave, que es un lenguaje de transformación utilizado en Mule4. La función de transformación se ve así:

    %dw 2.0
    output application/xml
    
    fun transformData(i: Object) =
        if(i.childList == []) 
            ({ 
                Category @(CategoryId: i.id) @(CategoryPath: i.code) @(Description: i.name) @(ShortDescription: i.displayName) : {
                    Extn @(ExtnSyncTS: headers.timeStamp) : ""
                } 
            })
        else 
            (
                i.childList map {
                    CategoryList : {
                        Category @(CategoryId: $.id) @(CategoryPath: $.code ++ "/" ++ $.childList.code) @(Description: $.name) @(ShortDescription: $.displayName) : {
                            Extn @(ExtnSyncTS: headers.timeStamp) : ""
                        },
                        transformData($)
                    }
                }
            )
    
    ---
    {
        CategoryListArray : transformData(payload)
    }
    

    Aquí, la función transformData() toma un objeto y lo mapea al formato XML según la estructura proporcionada. En la función, primero verificamos si childList está vacío. Si es así, lo mapeamos según la estructura XML dada. Si no, iteramos a través de cada elemento de childList y llamamos recursivamente a la función transformData().

    Finalmente, la función devuelve el resultado transformado en el formato XML requerido como se indica.

    Conclusión

    Por lo tanto, podemos transformar los datos JSON dados al formato XML requerido utilizando la función de Dataweave mencionada anteriormente. Esta función de transformación se puede utilizar en el flujo de Mule4 para implementar la transformación requerida.

Comments are closed.