可能是一个非常基本的问题,但我无法找到答案,因为这需要知道我不适用于我的案例。
我正在运行一个简单的python脚本来获取一些json响应。基本上我有防火墙,我需要阅读'配置文件中的一些信息。
以下是我的python脚本的有趣部分:
client = requests.session()
requests.packages.urllib3.disable_warnings()
api_cmdb = 'api/v2/cmdb/'
api_monitor = 'api/v2/monitor/'
try:
login = client.post(url + '/logincheck', data="username=" + name + "&secretkey=" + password, verify = False)
except requests.exceptions.ConnectionError:
requests.status_code = "Connection refused"
ini = client.cookies['ccsrftoken']
csrftoken = ini[1:-1]
client.headers.update({"X-CSRFTOKEN": csrftoken})
ae = client.get(url + api_cmdb + 'router/static', verify = False, params = {'vdom': 'root'})
#print json.dumps(vars(ae))
resp = ae.json()
pprint(resp)
client_logout = client.post(url + '/logout', verify = False)
client.close()
使用ae.json()时我们得到这个结果:
{u'build': 1547,
u'http_method': u'GET',
u'http_status': 200,
u'name': u'static',
u'path': u'router',
u'results': [{u'blackhole': u'disable',
u'comment': u'',
u'device': u'port1',
u'distance': 10,
u'dst': u'0.0.0.0 0.0.0.0',
u'dstaddr': u'',
u'dynamic-gateway': u'disable',
u'gateway': u'192.168.1.99',
u'internet-service': 0,
u'internet-service-custom': u'',
u'link-monitor-exempt': u'disable',
u'priority': 0,
etc.
我不明白为什么当我发出print json.dumps(vars(ae))或print json.dumps(ae)时,我得到了:
raise TypeError(repr(o) + " is not JSON serializable")
TypeError: <Response [200]> is not JSON serializable
非常感谢
答案 0 :(得分:2)
这是因为ae
是Response
个对象。当您调用ae.json()
时,它会返回该响应对象的JSON表示,但尝试手动序列化会产生错误,因为json
模块不知道如何将Response
对象转换为有效的JSON。你应该打电话给
print json.dumps(ae.json())
将使用自己的内部逻辑(Response
方法)获取.json()
对象的JSON表示,然后打印它的字符串版本。
答案 1 :(得分:1)
vars(ae)
或ae.__dict__
返回对象属性和值的字典。如果你检查它,你会发现它不仅包含响应的主体(通过调用ae.json()
转换为json),还包含许多其他属性。通常,它们中的一些可能是对象(在您的情况下是来自Response
的{{1}}对象),而不仅仅是字符串,列表等简单类型。
如果您想继续(如果它对您有意义),您需要继续执行自己的requests
和json.JSONEncoder
实施。