首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Json序列化问题

Json序列化问题
EN

Stack Overflow用户
提问于 2018-03-26 17:46:43
回答 2查看 2.5K关注 0票数 1

这可能是一个非常基本的问题,但我找不到答案,因为这需要知道我没有或不适用于我的情况。

我正在运行一个简单的python脚本来获得一些json响应。基本上,我有一个防火墙,我需要从配置文件中“读取”一些信息。

下面是我的python脚本中有趣的部分:

代码语言:javascript
复制
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()时,我们得到了这个结果:

代码语言:javascript
复制
{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.

我不明白的是,为什么当我发出打印json.dumps(vars(ae))或打印json.dumps(ae)时,我会得到一个:

代码语言:javascript
复制
raise TypeError(repr(o) + " is not JSON serializable")
TypeError: <Response [200]> is not JSON serializable

非常感谢

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2018-03-26 18:03:14

这是因为ae是一个Response对象。当调用ae.json()时,它返回响应对象的JSON表示,但是尝试手动序列化它将引发错误,因为json模块不知道如何将Response对象转换为有效的JSON。你应该打电话给我

代码语言:javascript
复制
print json.dumps(ae.json())

它将使用自己的内部逻辑( Response方法)获取.json()对象的JSON表示,然后打印它的字符串版本。

票数 2
EN

Stack Overflow用户

发布于 2018-03-26 18:12:59

vars(ae)ae.__dict__返回对象属性和值的字典。如果您检查它,您将看到它不仅包含响应的主体(通过调用ae.json()将其转换为json ),而且还包含许多其他属性。通常,其中一些可能是对象(在您的例子中是来自requestsrequests对象),而不仅仅是字符串、列表等简单类型。

如果您想更进一步(如果这对您有任何意义的话),您将需要继续您自己的json.JSONEncoderjson.JSONDecoder实现。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/49497542

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档