如何使用 JQ 字符串化 JSON

Ale*_*hen 10 json jq datadog

使用 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\"]}"
}
Run Code Online (Sandbox Code Playgroud)

我需要将其全部转换为以下字符串:

"{\"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\\\"]}\"}"
Run Code Online (Sandbox Code Playgroud)

这样我就可以获取该字符串并将其准确插入到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"
}
Run Code Online (Sandbox Code Playgroud)

pea*_*eak 14

简而言之,tostring就是你的朋友。

假设您的原始 JSON 对象位于名为 object.json 的文件中,并且模板位于 template.json 中,您可以编写:

jq --argfile object object.json '.text = ($object | tostring)' template.json
Run Code Online (Sandbox Code Playgroud)

不用说,这个主题有很多变体,例如

jq -n 'input | input + {text: tostring}' \
   object.json template.json
Run Code Online (Sandbox Code Playgroud)

或者如果稍微更晦涩的话更紧凑:

jq 'input + {text: tostring}' object.json template.json
Run Code Online (Sandbox Code Playgroud)

  • 你可以简单地写:`jq tostring my_file.json`:-) (6认同)

Jon*_*sen 9

我发现 @peak 在他们自己的答案中的评论非常有用,我想将其作为自己的答案:

$ echo '{ "foo": [ "bar", "baz" ] }' | jq -r tostring
{\"foo\":[\"bar\",\"baz\"]}
Run Code Online (Sandbox Code Playgroud)