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.

Combina múltiples archivos JSON en un solo archivo JSON usando filtros jq.

Tengo varios archivos json que necesito combinar en un solo archivo json gigante. Sé que puedo usar la opción básica -s y obtener un archivo gigante.

jq -s . littlefiles*.json >> giantfile.json

Mi problema es que no puedo encontrar la forma de filtrar los elementos y seguir combinándolos en un json válido. Todos mis intentos han dado como resultado la salida filtrada correcta, pero le falta la “,” entre ellos. He visto algunas respuestas en la web sobre cómo utilizar “map”, pero no veo su aplicación en mi filtrado. Tal vez estoy usando jq de manera incorrecta para lo que necesito.

Aquí hay un ejemplo del contenido de jq:

rfossi@xAMrfossi Responses % cat BBB.json | jq '.[] | { repo: .url[37:-1] | [rtrimstr("/branches/master/protectio")], PushUsers: [.restrictions.users[].login], PushTeams: [.restrictions.teams[].slug]}'
{
  "repo": [
    "homelaunch_basic"
  ],
  "PushUsers": [],
  "PushTeams": [
    "master-branch-mergers"
  ]
}
{
  "repo": [
    "homelaunch_base"
  ],
  "PushUsers": [],
  "PushTeams": []
}

Como puedes ver, obtengo la información que necesito. Pero le falta la “,” que lo hace un archivo json válido. Cuando intento combinar los archivos con este mismo filtrado, obtengo uno de los temidos mensajes “Cannot index array with string” (ejemplo básico a continuación). Creo que llevo mucho tiempo mirando esto y me estoy perdiendo algo obvio.

rfossi@xAMrfossi Responses % jq -r '.[] | { url: .url, users: [.restrictions.users[].login]}' B*.json > Bgiant.json
jq: error (at B1get-branch-prot-1641247960841.json:0): Cannot index string with string "url"
jq: error (at B2get-branch-prot-1641247961044.json:0): Cannot index string with string "url"
jq: error (at Bgiantfile.json:5): Cannot index array with string "url"
jq: error (at Bgiantfile.json:10): Cannot index array with string "url"
rfossi@xAMrfossi Responses %
Tags:  ,

Answer

  1. Avatar for davy.ai

    Para combinar múltiples archivos JSON mientras se filtra cierta información, puedes usar la función map en jq. Aquí tienes un ejemplo de comando:

    jq -s 'map(.[] | { repo: .url[37:-1] | [rtrimstr("/branches/master/protectio")], PushUsers: [.restrictions.users[].login], PushTeams: [.restrictions.teams[].slug]}) | add' *.json > giantfile.json
    

    Este comando aplicará el mismo filtro que usaste en tu comando original, pero primero usará map para aplicar el filtro a cada archivo individualmente, resultando en una lista de objetos. El | add al final luego combinará todos los objetos en un solo objeto JSON.

    Ten en cuenta que la operación | add automáticamente agrega comas entre los objetos, así que no tienes que preocuparte por eso.

Comments are closed.