出现错误“{”errorMessages”:[“解析 JSON 时出错。检查您的请求正文是否有效。"]}

出现错误“{”errorMessages”:[“解析 JSON 时出错。检查您的请求正文是否有效。"]}
curl --request POST \
          --url 'https://bankofloyal.atlassian.net/rest/api/2/issue' \
          --user [email protected]:$JIRA_TOKEN \
          --header 'Accept: application/json' \
          --header 'Content-Type: application/json' \
          --data '{
            "fields": {
              "project": {
                "key": "'$JIRA_PROJECT'"
              },
              "parent": {
                "key": "'$PARENT_ISSUE_KEY'"
              },
              "components": [
                {
                  "id": "'$COMPONENT_ID'"
                }
              ],
              "summary": "Directories with migration changes: '"${DIR_JOINED}"'",
              "description": "Name of models: '"${MODEL_NAMES}"'",
              "issuetype": {
                "name": "Sub-task"
              }
            }
          }'

我想要一张使用 cURL 生成的票证,但收到“JSON 解析错误”。在调试时,我发现问题出在正文的摘要和描述中,错误地使用了变量DIR_CHANGEDMODEL_NAME。你能建议一些其他方法吗?

答案1

由于不知道 shell 变量的实际内容,我假设至少有一个包含换行符、制表符、双引号或可能需要在 JSON 文档中编码的其他字符。一般来说,避免将 shell 字符串注入 JSON。用于jq从 shell 变量创建有效的 JSON。这确保了字符串被正确编码。

在下面的脚本片段中,我假设使用的五个 shell 变量jq 已经设置为其预期值。然后,该脚本通过提供 shell 变量来创建 JSON 文档,以jq将其作为 JSON 编码字符串插入到提供的“模板”中的适当位置。该结果被分配给payloadshell 变量,该变量稍后用作选项curl的选项参数--data

payload=$(
        jq -n -c \
                --arg project_key "$JIRA_PROJECT" \
                --arg parent_key "$PARENT_ISSUE_KEY" \
                --arg components_id "$COMPONENT_ID" \
                --arg dirs "$DIR_JOINED" \
                --arg models "$MODEL_NAMES" '
        {
                fields: {
                        project: { key: $project_key },
                        parent: { key: $parent_key },
                        components: [{ id: $components_id }],
                        summary: ("Directories with migration changes: " + $dirs),
                        description: ("Name of models: " + $models),
                        issuetype: { name: "Sub-task" }
                }
        }'
)

curl --request POST \
          --user "[email protected]:$JIRA_TOKEN" \
          --header 'Accept: application/json' \
          --header 'Content-Type: application/json' \
          --data "$payload" \
          'https://bankofloyal.atlassian.net/rest/api/2/issue'

请注意,表达式中使用的变量,如$dirs和,$project_keyjqjq变量,不是 shell 变量。它们从命令行--arg上的选项获取它们的值jq

summary作为和键的值的括号表达式description被括在括号中,因为它们是需要计算以获得最终值的表达式。

如果您需要创建jq包含非字符串数据的变量,例如,如果您需要插入布尔值、数字或 JSON 文档片段,请使用--argjsonin 代替--arg(即,jq ... --argjson components_id "$COMPONENT_ID" ...如果组件的 ID 应该是数字而不是一个字符串)。

答案2

这对于评论来说太长了。 (编辑:看来我会投票给隐形,请给一些自我调整的建议然后。 )(这从来不是为了拉选票,请将此视为一条评论,然后对上面的答案进行投票。

首先要事。请语法突出显示,除非代码块很琐碎(短,不引用密集型等),请参阅:什么是语法高亮以及它是如何工作的?。我写了```shell,而不是```开始下面的代码块。由于变量也是绿色的,所以它全部都是绿色的,这没什么帮助。

为了保持一致性,我更新了前几个变量扩展。

这看起来不错,这本来就不是扩展问题。

curl --request POST \
          --url 'https://bankofloyal.atlassian.net/rest/api/2/issue' \
          --user "[email protected]:${JIRA_TOKEN}" \
          --header 'Accept: application/json' \
          --header 'Content-Type: application/json' \
          --data '{
            "fields": {
              "project": {
                "key": "'"${JIRA_PROJECT}"'"
              },
              "parent": {
                "key": "'"${PARENT_ISSUE_KEY}"'"
              },
              "components": [
                {
                  "id": "'"${COMPONENT_ID}"'"
                }
              ],
              "summary": "Directories with migration changes: '"${DIR_JOINED}"'",
              "description": "Name of models: '"${MODEL_NAMES}"'",
              "issuetype": {
                "name": "Sub-task"
              }
            }
          }'

如果您想确定,请运行echo带引号的数据块。最好将其通过管道传输到jq,这应该会给出漂亮的 JSON 输出。

echo '
{
    "fields": {
        "project": {
            "key": "'"${JIRA_PROJECT}"'"
        },
        "parent": {
            "key": "'"${PARENT_ISSUE_KEY}"'"
        },
        "components": [
            {
                "id": "'"${COMPONENT_ID}"'"
            }
        ],
        "summary": "Directories with migration changes: '"${DIR_JOINED}"'",
        "description": "Name of models: '"${MODEL_NAMES}"'",
        "issuetype": {
            "name": "Sub-task"
        }
    }
}' | jq

深入研究可能会更好Jira Rest Api 示例或者在 StackOverflow 上询问,因为问题不是 BASH 也不是 Linux 问题。我检查了您的标志,它们与 Atlassian 网站上的内容相匹配,尽管其形式很长。

附录:

我已经评估了该命令的严格引用版本,因此@Kusalananda 是正确的,确实可能由于空格或特殊字符而出现引用错误。

然而,这个错误消息是Atlassian服务器的响应,curl确实工作正常。不过最好使用引用的版本。

也是一个Atlassian 社区主题建议它可能是@用户名中的

另一个附录

无论如何,只要凭据和 api 资源正确,curl 总是可以工作。它必须是一个新行或类似的行来预先终止数据块。因此标题中的错误。 @Kusalananda 说得对。

相关内容