获取JSON对象时无法连接“str”和“tuple”对象

2024-10-02 10:30:24 发布

您现在位置:Python中文网/ 问答频道 /正文

Python无法通过HTTP获取简单的JSON对象,因为在获取JSON对象错误时无法连接“str”和“tuple”对象。但是,同一个脚本在具有相同设置(操作系统、python版本、python模块等)的不同机器上运行时不会出现任何问题

使用的版本:python-2.6.6-52.el6.x86_64 操作系统:RHEL 6.6

脚本:

#!/usr/bin/env python

import requests
import json


def main():
   f = requests.get("http://peslog001.abc.local:9200/_cluster/health")
   health = f.json()
   print health

if __name__ == "__main__":
    main()

输出:

^{pr2}$

第二台计算机上相同脚本的输出:

./gettest.py
{u'status': u'green', u'number_of_nodes': 7, u'unassigned_shards': 0, u'timed_out': False, u'active_primary_shards': 1441, u'cluster_name': u'elasticsearch', u'relocating_shards': 0, u'active_shards': 2882, u'initializing_shards': 0, u'number_of_data_nodes': 4}

你知道为什么会这样吗?在

提前谢谢你。在

它从文件读取正常,只是它从URL获得的响应似乎有问题:

#!/usr/bin/env python

import requests
import json

def main():
   f = open("/etc/zabbix/testjson").read()
   health = json.loads(f)
   print health

if __name__ == "__main__":
    main()

输出:

 # ./gettest2.py
{u'status': u'green', u'number_of_nodes': 7, u'unassigned_shards': 0, u'timed_out': False, u'active_primary_shards': 1441, u'cluster_name': u'elasticsearch', u'relocating_shards': 0, u'active_shards': 2882, u'initializing_shards': 0, u'number_of_data_nodes': 4}

使用CURL获得响应没有问题:

# curl http://peslog001.abc.local:9200/_cluster/health
{"cluster_name":"elasticsearch","status":"green","timed_out":false,"number_of_nodes":7,"number_of_data_nodes":4,"active_primary_shards":1441,"active_shards":2882,"relocating_shards":0,"initializing_shards":0,"unassigned_shards":0}

。。。。在

curl -s -D - -o /dev/null peslog001.abc.local:9200/_cluster/health
HTTP/1.1 200 OK
Content-Type: application/json; charset=UTF-8
Content-Length: 230

在实用工具.py调试结果:

> /usr/lib/python2.6/site-packages/requests/utils.py(277)get_encoding_from_headers()
-> content_type = headers.get('content-type')
(Pdb) n
> /usr/lib/python2.6/site-packages/requests/utils.py(278)get_encoding_from_headers()
-> print content_type
(Pdb) n
('content-type', 'application/json; charset=UTF-8')
> /usr/lib/python2.6/site-packages/requests/utils.py(279)get_encoding_from_headers()
-> if not content_type:
(Pdb)
> /usr/lib/python2.6/site-packages/requests/utils.py(282)get_encoding_from_headers()
-> content_type, params = cgi.parse_header(content_type)
(Pdb)
TypeError: "cannot concatenate 'str' and 'tuple' objects"

在脚本运行的服务器上调试的输出显示内容类型不同:

> /usr/lib/python2.6/site-packages/requests/utils.py(277)get_encoding_from_headers()
-> content_type = headers.get('content-type')
(Pdb) n
> /usr/lib/python2.6/site-packages/requests/utils.py(278)get_encoding_from_headers()
-> print content_type
(Pdb) n
application/json; charset=UTF-8
> /usr/lib/python2.6/site-packages/requests/utils.py(279)get_encoding_from_headers()
-> if not content_type:
(Pdb) n
> /usr/lib/python2.6/site-packages/requests/utils.py(282)get_encoding_from_headers()
-> content_type, params = cgi.parse_header(content_type)
(Pdb) n

解决方法(确实很糟糕,但我不把phyton用于其他任何事情,所以我可以接受它):

将以下行添加到实用工具.py从\u headers()获取\u编码

content_type = "application/json; charset=UTF-8"

Tags: frompyjsongetlibpackagesusrtype

热门问题