jq: невозможно индексировать массив строкой "id" - PullRequest
0 голосов
/ 01 сентября 2018

Мой backup.json выглядит так:

{
  "andres": [
    [
      {
        "id": 1,
        "email": "password",
        "username": test1,
        "password": "email@email.com",
        "name": "Dummy Account",
        "address": "123 st road",,
        "ip_address": "0.0.0.0",
        "phone": "123-123-1234",
      },
      {
        "id": 2,
        "email": "email2@email.com",
        "username": test2,
        "password": "password",
        "name": "Dummy Account",
        "address": "123 st road",,
        "ip_address": "0.0.0.0",
        "phone": "123-123-1234"
      }
    ],
  ]
}

Я использую команду:

jq -r '.andres[] | .id, .email, .username, .password, .name, .address, .ip_address, .phone' < backup.json > backup.csv

но выдает ошибку:

Cannot index array with string "id"

Я хочу, чтобы это выглядело так:

1,email@email.com,test1,password,Dummy Account,123 st road,0.0.0.0,123-123-1234
2,email@email.com,test2,password,Dummy Account,123 st road,0.0.0.0,123-123-1234

Я новичок в использовании JQ. Может кто-нибудь исправить мою команду и сказать, где я ошибся?

Спасибо!

Ответы [ 3 ]

0 голосов
/ 01 сентября 2018

- забавный зверь. Я считаю, что это требует много проб и ошибок.

После исправления вашего JSON

$ jq -r '.andres[][] | map(values) | @csv' file.json
1,"password","test1","email@email.com","Dummy Account","123 st road","0.0.0.0","123-123-1234"
2,"email2@email.com","test2","password","Dummy Account","123 st road","0.0.0.0","123-123-1234"

Обратите внимание, что для id = 1 у вас есть переключенные значения пароля и электронной почты.

См. Также «Форматирование строк и экранирование» в руководстве jq

0 голосов
/ 02 сентября 2018

Значение andres в вашем json - это массив массивов, но вы получаете к нему доступ, как если бы это был массив объектов. Вы должны сначала сгладить массивы (или индексировать), чтобы получить доступ к объектам. Затем из этих объектов вы захотите отобразить нужные значения как csv как массив значений.

$ jq -r '
.andres[][] | [.id, .email, .username, .password, .name, .address, .ip_address, .phone] | @csv
' < backup.json > backup.csv

Обратите внимание на второй набор [] в .andres[][].

Возможно, вы захотите добавить несколько заголовков к вашему выводу.

$ jq -r '
["id", "email", "username", "password", "name", "address", "ip_address", "phone"] as $headers
    | $headers, (.andres[][] | [.[$headers[]]]) | @csv
' < backup.json > backup.csv
0 голосов
/ 01 сентября 2018

За исключением того, что это не был действительный json (есть дополнительные , в "phone": "123-123-1234",), но после удаления я смог получить действительный json здесь.
В вашем json-файле есть еще много массивов [ { .. } ], вам нужно учесть это с помощью [][][].
Следующий json:

{
  "Emails": [
    {
      "email@email.com": [
        {
          "andres": [
            [
              {
                "id": 1,
                "email": "email@email.com",
                "username": "test1",
                "password": "password",
                "name": "Dummy Account",
                "address": "123 st road",
                "ip_address": "0.0.0.0",
                "phone": "123-123-1234"
              },
              {
                "id": 2,
                "email": "email@email.com",
                "username": "test2",
                "password": "password",
                "name": "Dummy Account",
                "address": "123 st road",
                "ip_address": "0.0.0.0",
                "phone": "123-123-1234"
              }
            ],
            true
          ]
        }
      ]
    }
  ]
}

со следующим фильтром:

 .Emails[][][].andres[][] | .id, .email, .username, .password, .name, .address, .ip_address, .phone

дает мне:

jq: error (at <stdin>:34): Cannot iterate over boolean (true)
1
"email@email.com"
"test1"
"password"
"Dummy Account"
"123 st road"
"0.0.0.0"
"123-123-1234"
2
"email@email.com"
"test2"
"password"
"Dummy Account"
"123 st road"
"0.0.0.0"
"123-123-1234"
exit status 5

на jqplay . Я не знаю, что делать с этим true в json, это недопустимо, это должен быть элемент массива, например { "true" }.

...