Я написал небольшой скрипт Python, чтобы получить ответ от GitHub и его GraphQL API.

Вот что я закодировал:

import json
def pp_json(json_thing, sort=True, indents=4):
    if type(json_thing) is str:
        print(json.dumps(json.loads(json_thing),sort_key=sort, indent=indents))
    else:
        print(json.dumps(json_thing, sort_key=sort, indent=indents))
    return None

Я запускаю эту функцию с вывода моего запроса, как вы можете видеть здесь:

url = 'https://api.github.com/graphql'
json = { "query" : """query {
  viewer {
    login
    name
    bio
    company
    location
  }
}""" 
        }
api_token = "hiddencontent"
headers = {'Authorization': 'token %s' % api_token}

result_tokentest = requests.post(url=url, json=json, headers=headers) # just Response Code
string_tokentest = result_tokentest.text

print (result_tokentest)
print (string_tokentest)
pp_json(result_tokentest)

Я получаю следующий результат:

<Response [200]>
{"data":{"viewer":{"login":"datasienceelmo","name":"E.Lmo","bio":"Rohdaten sind geil!!","company":"Hochschule Ulm","location":"Ulm"}}}

--------------------------------------------------------------------------- AttributeError                            Traceback (most recent call last) <ipython-input-12-9c2eefbf15a2> in <module>()
     19 print (result_tokentest)
     20 print (string_tokentest)
---> 21 pp_json(result_tokentest)

<ipython-input-2-f2241ef62766> in pp_json(json_thing, sort, indents)
      4         print(json.dumps(json.loads(json_thing),sort_key=sort, indent=indents))
      5     else:
----> 6         print(json.dumps(json_thing, sort_key=sort, indent=indents))
      7     return None

AttributeError: 'dict' object has no attribute 'dumps'

Я не могу понять, в чем проблема с моим интерпретатором Python, потому что я импортировал JSON. И в документации я просто прочитал, как им пользоваться, и сделал то же, что и они.

2
E.Lmo 4 Янв 2018 в 21:12

1 ответ

Лучший ответ

Вы повторно использовали глобальное имя json для импорта модуля и для словаря. Последнее присваивание побеждает, поэтому json теперь ссылается на словарь, а не на модуль. Используйте другое имя для словаря, например json_data:

json_data = { "query" : """query {
  viewer {
    login
    name
    bio
    company
    location
  }
}""" 

# ...

result_tokentest = requests.post(url=url, json=json_data, headers=headers)

Не то чтобы вам здесь вообще нужна была библиотека json; библиотека requests поддерживает собственное декодирование ответов JSON путем вызова метода response.json(). Вы можете лучше распечатать результат, используя библиотеку pprint :

from pprint import pprint

pprint(result_tokentest.json())

В качестве примечания: сам запрос GraphQL - это не JSON . Нет смысла использовать библиотеку json для синтаксического анализа или вывода запроса GraphQL. Однако можно встраивать запрос GraphQL в документ JSON. Ответ полностью в формате JSON.

3
Martijn Pieters 4 Янв 2018 в 18:26