Превращение списка заголовков и списка значений в действительный json с помощью jq - PullRequest
0 голосов
/ 20 ноября 2018

Я работаю с такой конечной точкой:

curl -S www.example.com 
[[\"A", "B", "C", "D"]\n
["1","2",null,"4"]]

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

{"A": "1", "B": "2", "C" : null, "D": "4"}

Однако то, что кажется очевидным ответом здесь

из

curl -S www.example.com  | jq '{(.[0]) : .[1] }'

производит

jq: error (at <stdin>:1): Cannot use array (["A...) as object key

И

curl -S www.example.com  | jq '{.[0] : .[1] }'

производит

jq: error: syntax error, unexpected '.' (Unix shell quoting issues?) at <top-level>, line 1:
{.[0] : .[1] } 
jq: 1 compile error

Какой правильный синтаксис для

[[HEADER1,HEADER2,...]\n
[DATA1,DATA2]] 

ответов в JSON?

Источником моей проблемы являются кавычки null и символ новой строки?

1 Ответ

0 голосов
/ 20 ноября 2018

В соответствии с тем, что опубликовано, вывод команды curl настолько странен, что потребует специальной обработки.Скорее всего, вывод не такой странный, как показано, и команда sed, показанная как часть решения ниже, может потребовать настройки.

В любом случае, с вводом, как показано:

sed 's/\\"/"/;1s/\\n/,/' input.txt | jq '
  .[0] as $h
  | .[1] 
  | . as $in
  | reduce range(0;length) as $i
      ({}; .[$h[$i]] = $in[$i])'

производит желаемый результат.

Покупка за один раз

jq -Rs < input.txt '
  split("\n")
  | map(select(length>0))
  | ( .[0] | sub("[[]\\\\"; "") | sub("\\\\n"; "") | fromjson) as $h
  | .[1]
  | sub("\\]\\]"; "]")
  | fromjson
  | . as $in
  | reduce range(0;length) as $i
      ({}; .[$h[$i]] = $in[$i])'
...