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.

JOLT matriz json en un coincidencia aplicar String predeterminado

Teniendo el siguiente json de entrada:

{
   "familyMembers":[
      {
         "name":"Richard",
         "living":"Yes"
      },
      {
         "name":"Napoleon",
         "living":"No"
      }
   ]
}

El objetivo es cambiar "living":"Yes" a "living":"true", de modo que la salida deseada sea así:

{
   "familyMembers":[
      {
         "firstName":"Richard",
         "living":"true"
      },
      {
         "firstName":"Napoleon",
         "living":"false"
      }
   ]
}

La siguiente especificación no produce la salida deseada:

[
   {
      "operation":"shift",
      "spec":{
         "familyMembers":{
            "*":{
               "name":"familyMembers[&1].firstName",
               "living":{
                  "Yes":{
                     "#true":"familyMembers[&1].living"
                  },
                  "*":{
                     "#false":"familyMembers[&1].living"
                  }
               }
            }
         }
      }
   }
]

El campo living no está incluido. Si el familyMember se cambia de un array a un mapa, entonces el campo living se incluye en la salida con el valor esperado, como en este ejemplo: http://jolt-demo.appspot.com/#hashDefault

He estado luchando con este caso durante un par de días con diversas combinaciones de &, [], # y dígitos. Hasta ahora no he tenido suerte.

Una especificación como esta

[
   {
      "operation":"shift",
      "spec":{
         "familyMembers":{
            "*":{
               "name":"familyMembers[&1].firstName",
               "living":{
                  "Yes":{
                     "#true":"familyMembers[#].living"
                  },
                  "*":{
                     "#false":"familyMembers[#].living"
                  }
               }
            }
         }
      }
   }
]

produce

{
   "familyMembers":[
      {
         "firstName":"Richard",
         "living":[
            "true",
            "false"
         ]
      },
      {
         "firstName":"Napoleon"
      }
   ]
}

lo cual no es lo que se requiere.

Cualquier sugerencia o ayuda es bienvenida.

Tags:  , ,

Answer

  1. Avatar for davy.ai

    Para lograr la salida deseada, se puede utilizar la siguiente especificación:

    [{
      "operation": "shift",
      "spec": {
        "familyMembers": {
          "*": { // para cada elemento en el array familyMembers
            "name": "familyMembers[&1].firstName", // asignar el campo name a firstName
            "living": { // asignar el campo living
              "Yes": { // si el valor es "Yes"
                "$": "familyMembers[&1].living" // utilizar el valor actual y asignarlo a living
              },
              "No": { // si el valor es "No"
                "$": "familyMembers[&1].living" // utilizar el valor actual y asignarlo a living
              },
              "*": { // para cualquier otro valor
                "literal": false, // asignar el valor a false
                "$": "familyMembers[&3].living" // asignar a living
              }
            }
          }
        }
      }
    }]
    

    Esta especificación asignará el campo name a firstName y el campo living a true o false según su valor. Si el valor es “Yes”, se asignará a true, si es “No”, se asignará a false, y para cualquier otro valor se asignará a false.

    La salida de esta especificación será:

    {
      "familyMembers": [
        {
          "firstName": "Richard",
          "living": true
        },
        {
          "firstName": "Napoleon",
          "living": false
        }
      ]
    }
    

    que es la salida deseada.

Comments are closed.