创建 JSON Gist(冲突)
Create JSON Gist (conflict)
我想创建一个包含 JSON(有效的,我检查过)的 Gist,使用 curl
命令,如 here 所述。
我首先尝试了这个脚本:
configText=$(cat jsonFile.json)
generate_post_data()
{
cat <<EOF
{
"description": "the description for this gist",
"public": true,
"files": {
"file1.txt": {
"content": $configText
}
}
}
EOF
}
curlBody="$(generate_post_data)"
curlResponse=$(curl -H "Content-Type: application/json" -X POST -d '$curlBody' https://api.github.com/gists)
这给了我错误Problems parsing JSON
,所以我尝试直接在命令中传递文件:
curl -H "Content-Type:application/json" -data-binary @jsonFile.json https://api.github.com/gists
但我遇到了同样的错误。我知道这一定是 POST 请求的 JSON 主体与我文件的 JSON 之间的冲突(引号、括号...)。
如何将干净的 JSON 文件发送到 Gist?
对于您脚本中的问题:
- 在您的 curl 请求中,您在
POST -d '$curlBody'
中的 bash 变量周围使用单引号,使用双引号将其展开:POST -d "$curlBody"
content
是一个文本字段:"content": $configText
到 "content": "$configText"
configText
可以包含新行和未转义的双引号 "
,这会破坏您的 content
JSON 数据。您可以使用以下内容来转义引号并删除新行:
configText=$(cat test.json | sed 's/\"/\\"/g' | tr -d '\n')
以下示例使用 jq
JSON parser/builder 构建您的要点请求,并不是说此示例 不会 在您的输入:
#!/bin/bash
ACCESS_TOKEN="YOUR_ACCESSS_TOKEN"
description="the description for this gist"
filename="file1.txt"
curlBody=$(jq --arg desc "$description" --arg filename "$filename" '.|
{ "description": $desc,
"public": true,
"files": {
($filename) : {
"content": tostring
}
}
}' jsonFile.json)
curl -v -H "Content-Type: application/json" \
-H "Authorization: Token $ACCESS_TOKEN" \
-X POST -d "$curlBody" https://api.github.com/gists
以下内容将保留 replacing new lines 和 \n
输入的 json 中的新行:
#!/bin/bash
ACCESS_TOKEN="YOUR_ACCESSS_TOKEN"
description="the description for this gist. There are also some quotes 'here' and \"here\" in that description"
public="true"
filename="file1.txt"
desc=$(echo "$description" | sed 's/"/\"/g' | sed ':a;N;$!ba;s/\n/\n/g')
json=$(cat test.json | sed 's/"/\"/g' | sed ':a;N;$!ba;s/\n/\n/g')
curl -v -H "Content-Type: text/json; charset=utf-8" \
-H "Authorization: Token $ACCESS_TOKEN" \
-X POST https://api.github.com/gists -d @- << EOF
{
"description": "$desc",
"public": "$public",
"files": {
"$filename" : {
"content": "$json"
}
}
}
EOF
请注意,您的访问令牌必须具有 gist
范围
我想创建一个包含 JSON(有效的,我检查过)的 Gist,使用 curl
命令,如 here 所述。
我首先尝试了这个脚本:
configText=$(cat jsonFile.json)
generate_post_data()
{
cat <<EOF
{
"description": "the description for this gist",
"public": true,
"files": {
"file1.txt": {
"content": $configText
}
}
}
EOF
}
curlBody="$(generate_post_data)"
curlResponse=$(curl -H "Content-Type: application/json" -X POST -d '$curlBody' https://api.github.com/gists)
这给了我错误Problems parsing JSON
,所以我尝试直接在命令中传递文件:
curl -H "Content-Type:application/json" -data-binary @jsonFile.json https://api.github.com/gists
但我遇到了同样的错误。我知道这一定是 POST 请求的 JSON 主体与我文件的 JSON 之间的冲突(引号、括号...)。
如何将干净的 JSON 文件发送到 Gist?
对于您脚本中的问题:
- 在您的 curl 请求中,您在
POST -d '$curlBody'
中的 bash 变量周围使用单引号,使用双引号将其展开:POST -d "$curlBody"
content
是一个文本字段:"content": $configText
到"content": "$configText"
configText
可以包含新行和未转义的双引号"
,这会破坏您的content
JSON 数据。您可以使用以下内容来转义引号并删除新行:configText=$(cat test.json | sed 's/\"/\\"/g' | tr -d '\n')
以下示例使用 jq
JSON parser/builder 构建您的要点请求,并不是说此示例 不会 在您的输入:
#!/bin/bash
ACCESS_TOKEN="YOUR_ACCESSS_TOKEN"
description="the description for this gist"
filename="file1.txt"
curlBody=$(jq --arg desc "$description" --arg filename "$filename" '.|
{ "description": $desc,
"public": true,
"files": {
($filename) : {
"content": tostring
}
}
}' jsonFile.json)
curl -v -H "Content-Type: application/json" \
-H "Authorization: Token $ACCESS_TOKEN" \
-X POST -d "$curlBody" https://api.github.com/gists
以下内容将保留 replacing new lines 和 \n
输入的 json 中的新行:
#!/bin/bash
ACCESS_TOKEN="YOUR_ACCESSS_TOKEN"
description="the description for this gist. There are also some quotes 'here' and \"here\" in that description"
public="true"
filename="file1.txt"
desc=$(echo "$description" | sed 's/"/\"/g' | sed ':a;N;$!ba;s/\n/\n/g')
json=$(cat test.json | sed 's/"/\"/g' | sed ':a;N;$!ba;s/\n/\n/g')
curl -v -H "Content-Type: text/json; charset=utf-8" \
-H "Authorization: Token $ACCESS_TOKEN" \
-X POST https://api.github.com/gists -d @- << EOF
{
"description": "$desc",
"public": "$public",
"files": {
"$filename" : {
"content": "$json"
}
}
}
EOF
请注意,您的访问令牌必须具有 gist
范围