2017-02-24 52 views
2

我想用curl命令创建一个包含JSON(有效的一个,我选中)的Gist,如here所述。创建JSON要点(冲突)

我第一次尝试这个脚本:

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?

回答

2

对于脚本的问题:

    在袅袅的要求
  • ,您在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解析器/构造你要点的要求,不是说这个例子保留在新的生产线的输入:

#!/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保存在您的JSON输入新线,\\n

#!/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范围

+0

OMG太感谢你了! – ilansas

+0

我更新了我的帖子,其中保留了主要内容中的新行 –