2016-11-22 30 views
7

Burada sorun nedir?GitHub GraphQL API Ayrıştırma sorunları 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()) 

i

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

var ama Bu kod ön aşağıda doğru

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

headers = {'Authorization': 'token xxx} 

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

print (r2.json()) 
i (böylece" konulu 'veya \ ile" ve) dizeleri değiştirmek için çalıştı

ama işleri işe yaramıyor.

cevap

10

sorun çift tırnak (") ile ilgilidir ilk pasajı üzerinde , sen, aşağıdaki sonuç elde sorgu değişkeni ile '{"query": \"'+query+'\"}' katıldıklarında.

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

Bildirimi nasıl çift tırnak "ALEXSSS" bu nedenle ortaya çıkan dize bir json geçerli biçimde değil, çıkışı yapılmaz

ikinci pasajı çalıştırdığınızda, sonuçta dizedir.

{"query": "{ viewer { login name } }"} 
Geçerli bir json dizesi olan

.

En kolay ve en iyi çözüm, JSON kitaplığını yalnızca el ile yapmaya çalışmak yerine kullanmaktır; bu nedenle kaçış karakterleri hakkında endişelenmeniz gerekmez.

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()) 

Ama aynı zamanda sadece elle sorguya karakterlerden kurtulmak olabileceğini unutmayın:

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()) 

o beklendiği gibi :)

+0

neden o zaman ikinci kod parçacığı çalışması doğru benim örnekte çalışır? – Alex

+0

Açıklamaya yer vermek için orijinal yanıtı güncelleştirin. –

+0

@AdrianoMartins bu soruya bir göz atabilir [http://stackoverflow.com/questions/42063825/how-to-access-the-github-graphql-api-from-java-without-running-curl-commands- ins] –