Usar valores de array anidados jq [duplicar]

Tengo un archivo, vamos a llamarlo heroes.json, donde parte de los datos es un conjunto anidado de objeto, superpowers:

[
  {
    "hero": "Superman",
    "id": "123",
    "realName": "Clark Kent",
    "age": "?",
    "superpowers": [
      {
        "name": "speed",
        "num": "1",
        "des": "Faster than a speeding bullet.",
        "value": "50"
      },
      {
        "name": "strength",
        "num": "2",
        "des": "More powerful than a locomotive.",
        "value": "100"
      }
    ],
    "weakness": "kryptonite"
  },
  {
    "hero": "Batman",
    "id": "456",
...

Quiero seleccionar hero y superpowers, y mantener sólo name y des llaves dentro superpowers, como:

[
  {
    "hero": "Superman",
    "superpowers": [
      {
        "name": "speed",
        "des": "Faster than a speeding bullet."
      },
      {
        "name": "strength",
        "des": "More powerful than a locomotive."
      }
    ]
  },
  {
    "hero": "Batman",
    "superpowers": [
 ...

No sería difícil escribir un iterador para hacer esto, pero quiero probar jq ya que soy nuevo en esta herramienta y parece útil aprender.

Pregunta hecha hace 3 años, 4 meses, 26 días - Por codecrafty


3 Respuestas:

  • Así que experimenté jqplay hasta que entregó el formato necesario. No sé si es óptimo, pero esto funcionó:

    jq '[.[] | {hero, superpowers: [ .superpowers[] | {name, des} ] } ]'

    (Una sintaxis de filtro similar al gráficoQL haría esto más fácil.)

    Nota: La salida necesaria para mi json difiere de lo que se menciona en esta pregunta y respuesta, y he evitado usar mapa (iterator) en la solución. En otras palabras, no estoy haciendo la misma pregunta, o presentando la misma respuesta.

    Sería útil saber si mi solución es óptima.

    Respondida el Dec 19, 2020 a las 03:28 - por binaryblossom

    Votos positivos: 0 | Votos negativos: 0

  • Para lograr la transformación deseada en el archivo JSON utilizando jq, puedes hacer lo siguiente:

    bash
    jq '.[] | {hero, superpowers: [.superpowers[] | {name, des}]}' heroes.json
    

    Este comando jq seleccionará cada objeto en la matriz principal, extraerá las claves 'hero' y 'superpowers', y luego creará un nuevo objeto con esas claves. En la clave 'superpowers', solo se incluirán las claves 'name' y 'des' de cada objeto dentro de la matriz 'superpowers'.

    Puedes ejecutar este comando en tu terminal para obtener la salida JSON deseada. Recuerda reemplazar 'heroes.json' con la ruta correcta de tu archivo JSON si es necesario.

    Respondida el Dec 20, 2020 a las 03:30 - por Gpt

    Votos positivos: 0 | Votos negativos: 0

  • jq
    .[] | {hero, superpowers: (map(del(.value) | del(.num))) }
    

    Respondida el Dec 20, 2020 a las 03:33 - por Gemini

    Votos positivos: 0 | Votos negativos: 0