2016-11-22 6 views
7

Was ist hier falsch?GitHub GraphQL API Probleme bei der Analyse von JSON

query='{ repositoryOwner(login : "ALEXSSS") { login repositories (first : 30){ edges { node { name } } } } }' 

headers = {'Authorization': 'token xxx'} 

r2=requests.post('https://api.github.com/graphql', '{"query": \"'+query+'\"}',headers=headers) 

print (r2.json()) 

Ich habe

{'message': 'Problems parsing JSON', 'documentation_url': 'https://developer.github.com/v3'} 

aber dieser Code-Snippet unten korrekt funktioniert

query1= '''{ viewer { login name } }''' 

headers = {'Authorization': 'token xxx} 

r2=requests.post('https://api.github.com/graphql', '{"query": \"'+query1+'\"}',headers=headers) 

print (r2.json()) 

Ich habe versucht, aus Strings zu ändern (“on" oder mit \“und so weiter), aber es funktioniert nicht.

Antwort

10

Das Problem wird mit den doppelten Anführungszeichen verwendet (") Am ersten Schnipsel, wenn Sie die '{"query": \"'+query+'\"}' mit der Abfrage Variable beitreten, erhalten Sie folgendes Ergebnis:.

{"query": "{ repositoryOwner(login : "ALEXSSS") { login repositories (first : 30){ edges { node { name } } } } }"} 

Beachten Sie, wie die doppelten Anführungszeichen nicht entgangen, also kein json gültiges Format von "ALEXSSS" sind die resultierende Zeichenfolge ist

Wenn Sie den zweiten Schnipsel ausführen, die resultierende Zeichenfolge ist.

{"query": "{ viewer { login name } }"} 

Dies ist eine gültige JSON-Zeichenfolge.

Die einfachste und beste Lösung ist, einfach die JSON-Bibliothek zu verwenden, anstatt manuell zu versuchen, sodass Sie sich keine Gedanken über austretende Zeichen machen müssen.

import json 

query='{ repositoryOwner(login : "ALEXSSS") { login repositories (first : 30){ edges { node { name } } } } }' 
headers = {'Authorization': 'token xxx'} 

r2=requests.post('https://api.github.com/graphql', json.dumps({"query": query}), headers=headers) 

print (r2.json()) 

Aber denken Sie daran, dass Sie könnte auch nur die Zeichen von Hand auf der Abfrage entkommen:

query='{ repositoryOwner(login : \"ALEXSSS\") { login repositories (first : 30){ edges { node { name } } } } }' 
headers = {'Authorization': 'token xxx'} 

r2=requests.post('https://api.github.com/graphql', '{"query": "'+query1+'"}', headers=headers) 

print (r2.json()) 

funktioniert es wie erwartet :)

+0

warum dann die zweite Code-Abschnitte richtig in meinem Beispiel? – Alex

+0

Aktualisierte die ursprüngliche Antwort mit der Erläuterung. –

+0

@AdrianoMartins können Sie bitte einen Blick auf diese Frage [http://stackoverflow.com/questions/42063825/how-to-access-the-github-graphql-api-from-java-without-running-curl-commands- ins] –

Verwandte Themen