json.dumps 对我不起作用

Posted

技术标签:

【中文标题】json.dumps 对我不起作用【英文标题】:json.dumps doesn't work for me 【发布时间】:2018-06-14 12:47:36 【问题描述】:

我编写了一个小的 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。在文档中,我刚刚阅读了如何使用它,并按照他们的做法进行操作。

【问题讨论】:

【参考方案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 库支持通过调用 response.json() 方法本地解码 JSON 响应。您可以使用pprint library 更好地打印结果:

from pprint import pprint

pprint(result_tokentest.json())

附带说明:GraphQL 查询本身是不是 JSON。使用 json 库来解析或输出 GraphQL 查询是没有意义的。但是,可以在 JSON 文档中嵌入 GraphQL 查询。响应完全采用 JSON 格式。

【讨论】:

哇,伙计,非常感谢你,很抱歉你在我的问题中纠正了非常糟糕的英语:)。我按照你的建议使用 pprint :) 简单得多谢谢你这么笨:)

以上是关于json.dumps 对我不起作用的主要内容,如果未能解决你的问题,请参考以下文章

为啥 Class.forName() 对我不起作用?

为啥 '@drop' 事件在 vue 中对我不起作用?

为啥交换功能对我不起作用? [复制]

为啥 BlockInput 对我不起作用?我忘了啥吗?

为啥灯箱 jQuery 插件对我不起作用?

为啥发布到 PayPal 沙盒 API 对我不起作用?