web-dev-qa-db-fra.com

obtenir toutes les valeurs d'un tableau avec jq

J'analyse un fichier json avec jq:

jq .response[1].text file.json

Cela fonctionne bien, mais chaque fois que je dois entrer le nombre .response [2] .text, .response [3] .text etc. Je veux obtenir toutes les valeurs à la fois (200 valeurs)

Mais quand je fais:

jq .response[].text file.json

Il donne une erreur: impossible d'indexer le numéro avec la chaîne "texte"

Le fichier ressemble à ceci:

{
  "response": [
    1000,
    {
      "id": ,
      "date": ,
      "owner_id": ,
      "from_id": ,
      "post_type": "post",
      "text": "blabla",
      "attachment": {
        "type": "photo",
        "photo": {
          "pid": ,
          "aid": -7,
          "owner_id": 
        }
      },
      "attachments": [
        {
          "type": "photo",
          "photo": {
          }
        },
        {
          "type": "link",
          "link": {
            "url": "",
            "title": "",
            "description": "",
            "target": "external"
          }
        }
      ],
      "post_source": {
        "type": "vk"
      },
      "comments": {
        "count": 0,
        "groups_can_post": true,
        "can_post": 1
      },
    },
    {
      "id": ,
      "date": ,
      "owner_id": ,
      "from_id": ,
      "post_type": "post",
      "text":    "blabla",
      "attachment": {
        "type": "link",
        "link": {
          "url": "",
          "title": "",
          "description": "",
          "target": "external",
          "
        }
10
Miss Alena

De toute évidence, l'un des éléments du tableau est une chaîne. Si votre jq prend en charge "?", Alors une possibilité serait de l'utiliser:

.response[].text?

Un autre serait de vérifier le type explicitement, par exemple:

.response[] | objects | .text

Encore une autre possibilité:

.response[] | select(type=="object" and has("text")) | .text

Si vous souhaitez avoir une valeur d'espace réservé lorsqu'il n'y a pas de champ "texte":

 .response[] | if type=="object" and has("text") then .text else null end

Cela dépend donc vraiment de vos besoins et peut-être de la version de jq que vous utilisez.

16
peak