如何使用JQ对JSON进行字符串化

daolsyd0  于 2023-08-08  发布在  其他
关注(0)|答案(4)|浏览(116)

使用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"
}

brccelvz

brccelvz1#

简单地说,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

y4ekin9u

y4ekin9u2#

我发现@peak在他们自己的回答中的评论非常有用,我想让它自己成为一个答案:

$ echo '{ "foo": [ "bar", "baz" ] }' | jq -r tostring
{\"foo\":[\"bar\",\"baz\"]}

字符串

lvmkulzt

lvmkulzt3#

JQ为此提供了tojsonfromjson过滤器。
关于建议tostring的答案请注意:JQ手册中关于tojson的说明:
tojson内建与tostring的不同之处在于,tostring返回未修改的字符串,而tojson将字符串编码为JSON字符串。
所以我认为tojson总是正确的,但tostring只有在你使用复杂对象时才是正确的。

koaltpgm

koaltpgm4#

一种变体是使用tostring将JSON结构中的给定键字符串化,如下所示:

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
  }
}


(As根据A.H.的回答,如果你也希望字符串是json-string-encoded的,tojson可能比tostring有用)

相关问题