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.

Transformación de Jolt dentro de un array anidado de JSON.

Tengo un archivo JSON que incluye múltiples productos y cada producto tiene múltiples detalles de variantes. Usando Jolt, necesito obtener solo algunos campos del archivo JSON de entrada, con una estructura casi igual a la del archivo de entrada. He logrado iterar correctamente los productos, pero al intentar iterar cada variante del producto, no obtengo el resultado deseado.

Archivo de entrada:

{
  "products": [
    {
      "id": 6635020550275,
      "title": "UAT-9122021",
      "handle": "uat-9122021",
      "body_html": "UAT-9122021",
      "published_at": "2021-09-13T20:56:30+10:00",
      "created_at": "2021-09-13T20:56:28+10:00",
      "updated_at": "2021-09-13T21:05:17+10:00",
      "vendor": "Britax Test",
      "product_type": "",
      "tags": [],
      "variants": [
        {
          "id": 39516385214595,
          "title": "Default Title",
          "option1": "Default Title",
          "option2": null,
          "option3": null,
          "sku": "UAT-9122021",
          "requires_shipping": true,
          "taxable": true,
          "featured_image": null,
          "available": true,
          "price": "19.30",
          "grams": 0,
          "compare_at_price": null,
          "position": 1,
          "product_id": 6635020550275,
          "created_at": "2021-09-13T20:56:29+10:00",
          "updated_at": "2021-09-13T21:04:45+10:00"
        }
      ],
      "images": [],
      "options": [
        {
          "name": "Title",
          "position": 1,
          "values": [
            "Default Title"
          ]
        }
      ]
    },
    {
      "id": 6632446787715,
      "title": "UAT-992021",
      "handle": "uat-992021",
      "body_html": "UAT-992021",
      "published_at": "2021-09-09T22:53:05+10:00",
      "created_at": "2021-09-09T22:53:04+10:00",
      "updated_at": "2021-09-09T23:05:26+10:00",
      "vendor": "Britax Test",
      "product_type": "",
      "tags": [],
      "variants": [
        {
          "id": 39511546462339,
          "title": "Default Title",
          "option1": "Default Title",
          "option2": null,
          "option3": null,
          "sku": "UAT-992021",
          "requires_shipping": true,
          "taxable": true,
          "featured_image": null,
          "available": true,
          "price": "35.50",
          "grams": 0,
          "compare_at_price": null,
          "position": 1,
          "product_id": 6632446787715,
          "created_at": "2021-09-09T22:53:04+10:00",
          "updated_at": "2021-09-09T23:04:40+10:00"
        }
      ],
      "images": [],
      "options": [
        {
          "name": "Title",
          "position": 1,
          "values": [
            "Default Title"
          ]
        }
      ]
    }
  ]
}

Archivo de especificaciones:

[
  {
    "operation": "shift",
    "spec": {
      "products": {
        "*": {
          "created_at": "productDoc[&1].createdDateTime",
          "id": "productDoc[&1].id",
          "variants": {
            "*": {
              "id": "productDoc[&3].variants.[&1].ecommVariantId",
              "created_at": "productDoc[&3].variants.[&1].createdDateTime"
            }
          }
        }
      }
    }
  }
]

Resultado esperado:

{
  "productDoc": [
    {
      "createdDateTime": "2021-09-13T20:56:28+10:00",
      "id": 6635020550275,
      "variants": [
        {
          "ecommVariantId": [39516385214595],
          "createdDateTime": ["2021-09-13T20:56:29+10:00"]
        }
      ]
    },
    {
      "createdDateTime": "2021-09-09T22:53:04+10:00",
      "id": 6632446787715,
      "variants": [
        {
          "ecommVariantId": [39516385214595],
          "createdDateTime": ["2021-09-09T22:53:04+10:00"]
        }
      ]
    }
  ]
}

Resultado actual:

{
  "productDoc": [
    {
      "createdDateTime": "2021-09-13T20:56:28+10:00",
      "id": 6635020550275,
      "variants": [
        {
          "ecommVariantId": [39516385214595, 39511546462339],
          "createdDateTime": ["2021-09-13T20:56:29+10:00", "2021-09-09T22:53:04+10:00"]
        }
      ]
    },
    {
      "createdDateTime": "2021-09-09T22:53:04+10:00",
      "id": 6632446787715
    }
  ]
}
Tags:  , ,

Answer

  1. Avatar for davy.ai

    El problema con el resultado actual es que la especificación de Jolt no está recorriendo adecuadamente cada variante del producto. Para obtener el resultado esperado, necesitamos incluir otra operación “shift” para recorrer cada variante del producto.

    Aquí está el Spec.json actualizado que debería producir el resultado esperado:

    [
      {
        "operation": "shift",
        "spec": {
          "products": {
            "*": {
              "created_at": "productDoc[&1].createdDateTime",
              "id": "productDoc[&1].id",
              "variants": {
                "*": {
                  "id": "productDoc[&3].variants[&1].ecommVariantId",
                  "created_at": "productDoc[&3].variants[&1].createdDateTime"
                }
              }
            }
          }
        }
      },
      {
        "operation": "shift",
        "spec": {
          "productDoc": {
            "*": {
              "variants": {
                "*": {
                  "ecommVariantId": {
                    "*": "productDoc[&4].variants[&2].ecommVariantId[]"
                  },
                  "createdDateTime": {
                    "*": "productDoc[&4].variants[&2].createdDateTime[]"
                  }
                }
              }
            }
          }
        }
      }
    ]
    

    Añadimos una segunda operación “shift” que recorre cada variante de cada producto y crea un nuevo objeto para cada una. La diferencia clave es el uso de la notación “&4” en la ruta de salida, que hace referencia al objeto padre dos niveles más arriba en la jerarquía JSON (uno más arriba siendo “&3” y dos más arriba siendo “&2”).

    Con esta especificación actualizada, el resultado debería ser exactamente igual al resultado esperado proporcionado.

Comments are closed.