2016-11-22 14 views
7

पार्सिंग क्या गलत है?GitHub GraphQL API समस्याएं 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()) 

मैं

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

मिला लेकिन इस कोड स्निपेट को नीचे ठीक से काम करता

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

headers = {'Authorization': 'token xxx} 

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

print (r2.json()) 

मैं बाहर की कोशिश की ("पर 'या \ के साथ" और इसी तरह) तार बदलने के लिए है, लेकिन यह काम नहीं करता है।

उत्तर

10

समस्या, डबल कोट्स (") के साथ संबंधित है पहले टुकड़ा पर जब आप क्वेरी चर के साथ '{"query": \"'+query+'\"}', तो आपको निम्न परिणाम प्राप्त में शामिल होने:।

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

सूचना कैसे दोहरे उद्धरण "ALEXSSS" से भाग नहीं कर रहे हैं, इसलिए उसके एवज में स्ट्रिंग एक json मान्य स्वरूप नहीं है

जब आप दूसरा टुकड़ा चलाने के लिए, उसके एवज में स्ट्रिंग है:।

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

जो एक वैध जेसन स्ट्रिंग है।

सबसे आसान और सबसे अच्छा समाधान मैन्युअल रूप से इसे करने की कोशिश करने के बजाय JSON लाइब्रेरी का उपयोग करता है, इसलिए आपको वर्णों से बचने की चिंता करने की आवश्यकता नहीं होगी।

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

लेकिन याद रखें कि आप भी बस मैन्युअल रूप से क्वेरी पर वर्ण से बचें सकता है:

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

यह उम्मीद के रूप में :)

+0

तो क्यों दूसरा कोड स्निपेट काम सही ढंग से मेरी उदाहरण में काम करता है? – Alex

+0

स्पष्टीकरण शामिल करने के लिए मूल उत्तर अपडेट किया गया। –

+0

@AdrianoMartins कृपया इस प्रश्न पर एक नज़र डालें [http://stackoverflow.com/questions/42063825/how-to-access-the-github-graphql-api-from-java-without-running-curl-commands- इन की] –