преобразовать JSON, чтобы добавить объекты массива - PullRequest
0 голосов
/ 21 июня 2019

Мне нужно преобразовать массив, добавив дополнительные объекты -

У меня есть:

"user_id":"testuser"
"auth_token":"abcd"

Мне нужно:

"key":"user_id"
"value":"testuser"
"key":"auth_token"
"value":"abcd"

Я использовал jq, но не могу понять, как это сделать.Нужно ли сначала преобразовать это в массив multi-dimensional?

Я пробовал несколько jq запросов, но не могу найти наиболее подходящий

Когда я пытаюсь использовать jq, я получаю

jq: error: синтаксическая ошибка, неожиданный конец $, ожидание QQSTRING_TEXT или QQSTRING_INTERP_START или QQSTRING_END (проблемы цитирования оболочки Unix?) В строке 1

Ответы [ 3 ]

1 голос
/ 21 июня 2019

Ваш ввод не json, это просто набор того, что можно рассматривать как пары ключ / значение. Предполагая, что ваш вход JSON на самом деле выглядит так:

{
    "user_id": "testuser",
    "auth_token": "abcd"
}

Вы можете получить массив объектов пары ключ / значение, используя to_entries.

$ jq 'to_entries' input.json
[
    {
        "key": "user_id",
        "value": "testuser"
    },
    {
        "key": "auth_token",
        "value": "abcd"
    }
]

Если, с другой стороны, ваш ввод был на самом деле таким, вам нужно будет преобразовать его в формат, который можно обработать. К счастью, вы можете прочитать ее как необработанную строку и, возможно, проанализировать с помощью регулярных выражений или базовой обработки строк.

$ jq -Rn '[inputs|capture("\"(?<key>[^\"]+)\":\"(?<value>[^\"]*)\"")]' input.txt
$ jq -Rn '[inputs|split(":")|map(fromjson)|{key:.[0],value:.[1]}]' input.txt
1 голос
/ 22 июня 2019

Надежное преобразование key:value строк в JSON.

Если спецификации key:value будут действительными JSON, за исключением отсутствующей пунктуации (открывающие и закрывающие скобки и т. Д.), Тогда простой и достаточно надежный подход кпреобразование этих пар ключ: значение в один допустимый объект JSON иллюстрируется следующим образом:

cat <<EOF | jq -nc -R '["{" + inputs + "}" | fromjson] | add' 
"user_id": "testuser"
"auth_token" : "abcd"
EOF

Вывод

{
  "user_id": "testuser",
  "auth_token": "abcd"
}
1 голос
/ 21 июня 2019

Для этого можно использовать фильтр to_entries .

Вот пример jqplay

...