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.

jq — Extraer cadenas de caracteres contenidas en matrices y objetos anidados.

Tengo este filtro jq y entrada:

none
( ._birthDate.extension[0] | .url, ( .extension[0] | .url, .valueString ), ( .extension[1] | .url, .valueString ) )

json
{
    " _birthDate":{
        "extension":[
            {
                "url":"http://catsalut.gencat.cat/fhir/StructureDefinition/patient-dataBirhtDeath",
                "extension":[
                    {
                        "url":"country",
                        "valueString":"724"
                    },
                    {
                        "url":"state",
                        "valueString":"08"
                    }
                ]
            }
        ]
    }
}

...lo cual produce la siguiente salida:

json
"http://catsalut.gencat.cat/fhir/StructureDefinition/patient-dataBirhtDeath"
"country"
"724"
"state"
"08"

Quería refactorizar el filtro:

none
( ._birthDate.extension[0] | .url, ( .extension[:2] | .url, .valueString ) )

…pero estoy obteniendo el siguiente error:

> jq: error (at <stdin>:18): Cannot index array with string "url"

Ver esta demo.

Tags:  

Answer

  1. Avatar for davy.ai

    El error se produce al intentar acceder a la clave “url” de una matriz utilizando la sintaxis “.” que solo funciona para objetos. Para solucionar esto, podemos usar la sintaxis “[]” para iterar sobre la matriz y extraer las claves “url”:

    ( ._birthDate.extension[0] | .url, ( .extension[:2][] | select(.url) | .url, .valueString ) )
    

    Este filtro primero extrae la clave “url” del primer elemento en la matriz “_birthDate.extension” y luego itera sobre los primeros dos elementos de la matriz “extension” dentro de él. Para cada uno de estos elementos, el filtro “select(.url)” selecciona solo el objeto que contiene una clave “url” y extrae tanto las claves “url” como “valueString”.

    Con este filtro, la salida debería ser:

    "http://catsalut.gencat.cat/fhir/StructureDefinition/patient-dataBirhtDeath"
    "country"
    "724"
    "state"
    "08"
    

    Vea esta demostración.

Comments are closed.