Как преобразовать JSON в строки с помощью JQ

Используя JQ, я хотел бы взять сложный объект JSON, который включает JSON, встроенный в виде строк, а затем превратить все это в действительную строку, которую я могу легко встроить в другие объекты JSON.

Например, допустим, у меня есть этот объект json:

{
  "region": "CA",
  "waf_rule_tags": "{\"RULEID:942100\":[\"application-multi\",\"language-multi\",\"platform-multi\",\"attack-sqli\",\"OWASP_CRS/WEB_ATTACK/SQL_INJECTION\",\"WASCTC/WASC-19\",\"OWASP_TOP_10/A1\",\"OWASP_AppSensor/CIE1\",\"PCI/6.5.2\"]}"
}

Мне нужно превратить все это в следующую строку:

"{\"region\": \"CA\",\"waf_rule_tags\": \"{\\\"RULEID:942100\\\":[\\\"application-multi\\\",\\\"language-multi\\\",\\\"platform-multi\\\",\\\"attack-sqli\\\",\\\"OWASP_CRS/WEB_ATTACK/SQL_INJECTION\\\",\\\"WASCTC/WASC-19\\\",\\\"OWASP_TOP_10/A1\\\",\\\"OWASP_AppSensor/CIE1\\\",\\\"PCI/6.5.2\\\"]}\"}"

Таким образом, я могу взять эту строку и вставить ее точно под поле text другого объекта JSON, чтобы создать следующее.

{
      "title": "12345-accesslogs",
      "text": "{\"region\": \"CA\",\"waf_rule_tags\": \"{\\\"RULEID:942100\\\":[\\\"application-multi\\\",\\\"language-multi\\\",\\\"platform-multi\\\",\\\"attack-sqli\\\",\\\"OWASP_CRS/WEB_ATTACK/SQL_INJECTION\\\",\\\"WASCTC/WASC-19\\\",\\\"OWASP_TOP_10/A1\\\",\\\"OWASP_AppSensor/CIE1\\\",\\\"PCI/6.5.2\\\"]}\"}",
      "priority": "normal",
      "tags": ["environment:test"],
      "alert_type": "info"
}

person Alex Cohen    schedule 29.04.2020    source источник


Ответы (2)


Короче говоря, tostring - ваш друг.

Предполагая, что ваш исходный объект JSON находится в файле с именем object.json, а шаблон находится в template.json, вы можете написать:

jq --argfile object object.json '.text = ($object | tostring)' template.json

Излишне говорить, что существует множество вариаций на эту тему, например

jq -n 'input | input + {text: tostring}' \
   object.json template.json

или более компактно, если немного неясно:

jq 'input + {text: tostring}' object.json template.json
person peak    schedule 29.04.2020
comment
Ага jq '.| tostring' my_file.json было то, что я искал. - person Alex Cohen; 29.04.2020
comment
Вы можете просто написать: jq tostring my_file.json :-) - person peak; 29.04.2020

Я нашел комментарий @pex в их собственном ответе настолько полезным, что я хотел сделать его самостоятельным ответом:

$ echo '{ "foo": [ "bar", "baz" ] }' | jq tostring
"{\"foo\":[\"bar\",\"baz\"]}"
person Community    schedule 17.07.2021