在Bash中正确地将对象嵌套在对象中

时间:2018-02-02 00:15:03

标签: bash shell jenkins slack slack-api

我正在构建一个Bash shell脚本,以便在Jenkins中作为构建后任务运行。

此脚本有条件地设置一些信息,然后将其发送到Slack的入站Webhook API。

信息通过cURL请求发送,我发送的JSON对象可以接受指向对象数组的attachments键。

这是我的附件数组和整个JSON对象的代码

attachments="[\"{\"fallback\":\"This\u0020is\u0020a\u0020fallback\u0020message\u0020just\u0020in\u0020case\",\"color\":\"#36a64f\",\"author_name\":\"$author_name\",\"text\":\"$text\"}\"]"

json="{\"channel\":\"$channel\",\"username\":\"$username\",\"icon_emoji\":\"$emoji\",\"attachments\":\"$attachments\"}"

在Jenkins的控制台输出中,我在cURL请求中看到以下翻译:

curl -X POST --data '{"channel":"#jenkinsslacktest","username":"Jenkins-Bot","icon_emoji":":rocket:","attachments":"["{"fallback":"This\u0020is\u0020a\u0020fallback\u0020message\u0020just\u0020in\u0020case","color":"#36a64f","author_name":"TestAuthor","text":":rocket:\u0020:rocket:\u0020SUCCESS!\u0020:rocket:\u0020:rocket:"}"]"}' https://hooks.slack.com/services/link-to-my-webhook

在格式化方式上,我的webhook没有正确触发,也没有消息发送到我选择的Slack频道。

如果我替换了attachments键/值对,只是将text行放在其位置,则此调用成功。

似乎我没有正确转义或格式化此attachments值。我应该做些什么?

1 个答案:

答案 0 :(得分:0)

这里唯一的问题是attachments数组的JSON语法。您需要删除[]周围的引号,以使其成为有效的JSON语法。然后它会工作。

这是正确的bash行:

curl -X POST --data '{"channel":"#jenkinsslacktest","username":"Jenkins-Bot","icon_emoji":":rocket:","attachments":[{"fallback":"This\u0020is\u0020a\u0020fallback\u0020message\u0020just\u0020in\u0020case","color":"#36a64f","author_name":"TestAuthor","text":":rocket:\u0020:rocket:\u0020SUCCESS!\u0020:rocket:\u0020:rocket:"}]}' https://hooks.slack.com/services/link-to-my-webhook

您可以使用JSONLintJSONViewer等工具来验证您的JSON语法是否正确。