JQ: ошибка (при <stdin>: 1): не удается индексировать массив со строкой «имя» решено - PullRequest
0 голосов
/ 19 марта 2020

Я пытаюсь создать JSON коллекцию страны, региона, города, организации, ip попыток вторжения.

My JSON информация о тестировании:

[
  {
    "total": 0,
    "country": [
      {
        "name": "CN",
        "nr": 0,
        "region": [
          {
            "name": "Beijing",
            "nr": 0,
            "City": [
              {
                "name": "Haidian",
                "nr": 0,
                "Organisation": [
                  {
                    "name": "AS45090 Shenzhen Tencent Computer Systems Company Limited",
                    "nr": 0,
                    "IPS": [
                      {
                        "192.144.207.22": 0
                      }
                    ]
                  }
                ]
              }
            ]
          }
        ]
      },
      {
        "name": "NL",
        "nr": 0,
        "region": [
          {
            "name": "Noord Holland",
            "nr": 0,
            "City": [
              {
                "name": "Amsterdam",
                "nr": 0,
                "Organisation": [
                  {
                    "name": "FEAS",
                    "nr": 0,
                    "IPS": [
                      {
                        "192.162.1.1": 0
                      }
                    ]
                  }
                ]
              }
            ]
          }
        ]
      }
    ]
 }
]

Я загружаю существующую json (тестовую) строку в $geoInfo. Теперь я пытаюсь изменить значение nr в объекте, где "name": "CN"

я проверил два решения:

geoInfo="$( jq --arg country ${tmpGeo[0]} --arg count $count -r '.country | map( if .name == $country then . + { .nr=$count } else . end )'<<<"${geoInfo}" )"

И

geoInfo="$( jq --arg country ${tmpGeo[0]} --arg count $count -r '.country | select(.[].name == "CN") | .nr) = $count'<<<"${geoInfo}" )"

С обоими решениями я получаю: jq: error (at <stdin>:1): Cannot index array with string "name"

Я использую JQ версии 1.6.

Что не так?

Ответы [ 2 ]

0 голосов
/ 19 марта 2020

Просто забудь все это! Я ужасно извиняюсь. Ошибки, которые я получил, были для утверждения в разделе else, и я менял запрос в тогдашнем разделе. Наверное, долго работал над кодом вчера. в моем первом решении была небольшая ошибка после изменения .nr= на "nr":, это сработало:

geoInfo = "$ (jq --arg country $ {tmpGeo [0]} --arg count $ count - r '.country | map (если .name == $ страна, то. + {"nr": $ count} else. end)' <<< "$ {geoInfo}") "</p>

0 голосов
/ 19 марта 2020

Не могли бы вы попробовать следующее:

geoInfo=$(jq "(.[].country[] | select(.name == \"CN\") | .nr) = 1" <<<"$geoInfo")
...