obtener multidimensional elementos datos crear con array agregar acceder json bash jq

elementos - json multidimensional array php



Agregue un nuevo elemento a una matriz JSON existente usando jq (2)

En lugar de usar |= aquí, es mucho mejor usar += :

.data.messages += [{"date": "2010-01-07T19:55:99.999Z", "xml": "xml_samplesheet_2017_01_07_run_09.xml", "status": "OKKK", "message": "metadata loaded into iRODS successfullyyyyy"}]

Prepend

Por otro lado, si (como pidió @NicHuang) desea agregar el objeto JSON al principio de la matriz, podría usar el patrón:

.data.messages |= [ _ ] + .

Tengo un archivo json y quiero agregarle una nueva matriz de objetos. Estoy tratando de usar la línea de comandos jq. Mientras miraba en Internet, este comando es para hacer eso, no solo para los objetos de consulta en el archivo Json. Pero no puedo entender cómo usar el comando ADD en jq. Mi archivo Json es report-2017-01-07.json >>

{ "report":"1.0", "data":{ "date":"2010-01-07", "messages":[ { "date":"2010-01-07T19:58:42.949Z", "xml":"xml_samplesheet_2017_01_07_run_09.xml", "status":"OK", "message":"metadata loaded into iRODS successfully" }, { "date":"2010-01-07T20:22:46.949Z", "xml":"xml_samplesheet_2017_01_07_run_09.xml", "status":"NOK", "message":"metadata duplicated into iRODS" }, { "date":"2010-01-07T22:11:55.949Z", "xml":"xml_samplesheet_2017_01_07_run_09.xml", "status":"NOK", "message":"metadata was not validated by XSD schema" } ] } }

Estoy usando el siguiente comando >>

$ cat report-2017-01-07.json | jq -s ''.data.messages {"date": "2010-01-07T19:55:99.999Z", "xml": "xml_samplesheet_2017_01_07_run_09.xml", "status": "OKKK", "message": "metadata loaded into iRODS successfullyyyyy"}'' jq: error: syntax error, unexpected ''{'', expecting $end (Unix shell quoting issues?) at <top-level>, line 1: .data.messages {"date": "2010-01-07T19:55:99.999Z", "xml": "xml_samplesheet_2017_01_07_run_09.xml", "status": "OKKK", "message": "metadata loaded into iRODS successfullyyyyy"} jq: 1 compile error

Ya probé otra combinación de comandos pero siempre estoy terminando con la compilación de errores. ¿Alguna pista sobre eso? ¡Gracias!

la salida debe verse como >>

{ "report": "1.0", "data": { "date": "2010-01-07", "messages": [{ "date": "2010-01-07T19:58:42.949Z", "xml": "xml_samplesheet_2017_01_07_run_09.xml", "status": "OK", "message": "metadata loaded into iRODS successfully" }, { "date": "2010-01-07T20:22:46.949Z", "xml": "xml_samplesheet_2017_01_07_run_09.xml", "status": "NOK", "message": "metadata duplicated into iRODS" }, { "date": "2010-01-07T22:11:55.949Z", "xml": "xml_samplesheet_2017_01_07_run_09.xml", "status": "NOK", "message": "metadata was not validated by XSD schema" }, { "date": "2010-01-07T19:55:99.999Z", "xml": "xml_samplesheet_2017_01_07_run_09.xml", "status": "OKKKKKKK", "message": "metadata loaded into iRODS successfullyyyyy" }] } }


La parte |= .+ En el filtro agrega un nuevo elemento a la matriz existente. Puedes usar el jq con filtro como

jq ''.data.messages[3] |= . + {"date": "2010-01-07T19:55:99.999Z", "xml": "xml_samplesheet_2017_01_07_run_09.xml", "status": "OKKK", "message": "metadata loaded into iRODS successfullyyyyy"}'' inputJson

Para evitar el uso del valor de longitud codificado 3 y agregar dinámicamente un nuevo elemento, use . | length . | length . | length que devuelve la longitud, que se puede utilizar como el siguiente índice de matriz, es decir,

jq ''.data.messages[.data.messages| length] |= . + {"date": "2010-01-07T19:55:99.999Z", "xml": "xml_samplesheet_2017_01_07_run_09.xml", "status": "OKKK", "message": "metadata loaded into iRODS successfullyyyyy"}'' inputJson

(o) según la sugerencia de Peak en los comentarios, utilizando solo el operador +=

jq ''.data.messages += [{"date": "2010-01-07T19:55:99.999Z", "xml": "xml_samplesheet_2017_01_07_run_09.xml", "status": "OKKK", "message": "metadata loaded into iRODS successfullyyyyy"}]''

Lo que produce la salida que necesites.

{ "report": "1.0", "data": { "date": "2010-01-07", "messages": [ { "date": "2010-01-07T19:58:42.949Z", "xml": "xml_samplesheet_2017_01_07_run_09.xml", "status": "OK", "message": "metadata loaded into iRODS successfully" }, { "date": "2010-01-07T20:22:46.949Z", "xml": "xml_samplesheet_2017_01_07_run_09.xml", "status": "NOK", "message": "metadata duplicated into iRODS" }, { "date": "2010-01-07T22:11:55.949Z", "xml": "xml_samplesheet_2017_01_07_run_09.xml", "status": "NOK", "message": "metadata was not validated by XSD schema" }, { "date": "2010-01-07T19:55:99.999Z", "xml": "xml_samplesheet_2017_01_07_run_09.xml", "status": "OKKK", "message": "metadata loaded into iRODS successfullyyyyy" } ] } }

Use jq-play para secar ejecute su jq-filter y optimice de la forma que desee.