2017-02-24 7 views
2

Ich möchte einen Gist erstellen, der eine JSON (gültige, ich überprüfte) mit curl Befehl wie beschrieben here.Create JSON Gist (Konflikt)

Ich versuchte zunächst, dieses Skript:

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) 

Was mich den Fehler gab Problems parsing JSON, so habe ich versucht, die Datei direkt in dem Befehl übergeben:

curl -H "Content-Type:application/json" -data-binary @jsonFile.json https://api.github.com/gists 

Aber ich bin mit dem gleichen Fehler . Ich weiß, dass dies ein Konflikt zwischen dem JSON-Körper der POST-Anfrage und dem JSON meiner Datei sein muss (Zitate, Klammern ...).

Wie kann ich eine saubere JSON-Datei an Gist senden?

Antwort

2

Für die Probleme in Ihrem Skript:

  • in Ihrem curl Anfrage, verwenden Sie einfache Anführungszeichen um Ihre bash Variable in POST -d '$curlBody', verwenden Sie doppelte Anführungszeichen um es zu erweitern: POST -d "$curlBody"
  • content ein Textfeld ist: "content": $configText zu "content": "$configText"
  • configText können neue Linien und unescaped doppelte Anführungszeichen " die Ihre content JSON-Daten zu brechen. Sie könnten die folgenden Befehle verwenden Anführungszeichen zu entkommen und entfernen neue Linien:

    configText=$(cat test.json | sed 's/\"/\\\"/g' | tr -d '\n') 
    

Das folgende Beispiel Ihre Kern-Anforderung mit jq JSON-Parser/Builder bauen, nicht, dass dieses Beispiel wird nicht neue Linien erhalten in Ihrem Eingang:

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

Die folgende neue Zeilen in Ihrem json Eingang erhalten wird durch replacing new lines mit \\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 

Beachten Sie, dass Ihr Zugriffstoken den gist Umfang

+0

OMG vielen Dank haben! – ilansas

+0

Ich habe meinen Beitrag mit einer Version aktualisiert, die neue Zeilen in Ihrem Inhalt enthält –