如何使用JQ将JSON对象转化为字符串

10

我将使用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\\\"]}\"}"

这样,我就可以将这个字符串粘贴到另一个JSON对象的text字段下面,从而创建以下内容。
{
      "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"
}
4个回答

14

简而言之,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

1
没错,jq '.| tostring' my_file.json 就是我要找的。 - Alex Cohen
6
你可以简单地写成:jq tostring my_file.json :-) (该命令用于将JSON文件转换为字符串格式,笑脸符号是表情符号) - peak

9
我发现@peak在他们自己的回答中的评论非常有用,所以我想将它单独作为一个回答。
$ echo '{ "foo": [ "bar", "baz" ] }' | jq -r tostring
{\"foo\":[\"bar\",\"baz\"]}

4
JQ提供了tojsonfromjson过滤器。关于建议使用tostring的回答,JQ手册对tojson的说明如下: "tojson"与"tostring"的不同之处在于"tostring"返回未修改的字符串,而"tojson"将字符串编码为JSON字符串。因此,我认为只要您仅使用复杂对象,则始终正确使用tojson,但只使用tostring则不正确。

1
一个变体是在 JSON 结构中使用 tostring 将给定的键转换为字符串,类似于这样:
echo '{"a":1,"b":{"c":{"d":2},"e":3}}' | jq '.b.c=(.b.c|tostring)'

...目标路径为b.c,返回:

{
  "a": 1,
  "b": {
    "c": "{\"d\":2}",
    "e": 3
  }
}

根据A.H.的回答,如果您希望字符串也被编码为JSON字符串,则使用tojson可能会更有用,而不是tostring

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接