Mensaje de error "No se puede indexar la matriz con la cadena 'Título'" al analizar datos JSON con jq


9
{
    "content": [
    {
        "Title": "abc",
        "brand": "xyz",
        "size": "5 g",
        "date": "2019-01-01",
        "details": {
            "Temperature": [
            {
                "value": "90",
                "characteristics":"Normal"
            },
            {
                "value":"100",
                "characteristics":"high"
            },

            {
                "value":"80",
                "characteristics":"low"
            }
            ],

            "certifications": [
            {
                "value": "based",
                "characteristics":"pass"
            },

            {
                "value": "50",
                "characteristics":"failed"
            }
            ]
        },

         "formats": {
            "city": "NYC",
            "id": "007",
            "manufacture":""
            },
        "innerDetails": [
        {
            "contains": "abc",
            "panel":"xyz",
            "values":[
                {
                    "name":"abc",
                    "value":"10"
                },
                {
                    "name":"xyz",
                    "value":"20"
                }
                ]
            }
        ]
}
]
}

He intentado el siguiente enfoque, pero obtengo el error

No se puede indexar la matriz con la cadena "Título"

jq -r '.content[]|[.Title,.brand,.characteristics,.value]' $jsonfile.

Intenté en la misma línea con otras secciones, pero obtuve el mismo error.

¿Cómo resuelvo este problema?

Rendimiento esperado:

abc,xyz,90,Normal.
abc,xyz,100,high.
abc,xyz,80,low

Respuestas:


12

No estás obteniendo Cannot index array with string "Title"ese comando, estás obteniendo

[
  "abc",
  "xyz",
  null,
  null
]

ya que no hay characteristicso valueclave en los objetos de la contentsmatriz (son claves en la .details.Temperaturematriz secundaria).

El comando que le habría dado ese mensaje es:

jq -r '.[] | [.Title,.brand,.characteristics,.value]' "$jsonfile"

o

jq -r '.content | [.Title,.brand,.characteristics,.value]' "$jsonfile"

Perder la contentbúsqueda de claves, o no obtener los elementos de la contentmatriz, produce una matriz de un objeto en lugar del objeto en sí. Y no puede indexar una matriz con una cadena.


Suponiendo que desea salida CSV:

$ jq -r '.content[] | .details.Temperature[] as $t | [.Title,.brand,$t.value,$t.characteristics] | @csv' file.json
"abc","xyz","90","Normal"
"abc","xyz","100","high"
"abc","xyz","80","low"

El <object(s)> as <variable>actúa como un bucle en jq, por lo que lo que ocurre aquí es que $tserá asignado cada elemento de .details.Temperature[]su vez, y para cada elemento, se construye una matriz nueva. Se pasa la matriz a través de la @csvcual se generarán filas con formato CSV.

jqsiempre citará dos veces los campos de su salida CSV. Para deshacerse de citas innecesarias :

jq -r '...as above...' file.json | csvformat

( csvformates parte de csvkit)

O bien, puede utilizar @tsven lugar de @csvpara obtener resultados delimitados por tabulaciones en su lugar.


2
Kusal Gracias por sus aportes. Estoy usando lo anterior con for loop. detalles abajo. para campo en certificaciones de temperatura; do echo $ field :: jq --arg field "$ field" -r '.content [] | .detalles. "$ campo" [] como $ t | [.Título, .brand, $ t.value, $ t.caracteristics] | @csv 'file.json hecho. pero obteniendo "jq: error: try. [" field "] en lugar de .field para campos con nombres inusuales en <top-level>, línea 1:"
sam

Obtuve esto, no pude correlacionar y estaba poniendo .details. $ [Field] o .details. "$ Field". Ahora lo he cambiado a .details [$ field] [] y ahora funciona bien.
Sam

1
@sam Lo siento, estaba en otro lugar. Sí, .details[$field][]o .["details"][$field][]es la sintaxis correcta.
Kusalananda

He votado y gracias por su apoyo.
sam

Kusal, perdón por molestarte de nuevo. ¿Es posible obtener los valores principales del contenido sin dar el nombre de los campos? Valores de "Título", "marca", "tamaño", "fecha". algo así como jq -r .content [] | y me da todos los valores principales como se mencionó anteriormente.
Sam
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.