Python中requests.post获取JSON字符串遇AttributeError问题求助
解决你的JSON处理与AttributeError问题
让我们一步步拆解你的问题,先解决眼前的错误,再处理根源的格式问题:
1. 立即修复AttributeError
你当前代码里的json.dumps(r.text)完全搞反了JSON处理的方向:
json.dumps()是把Python对象转换成JSON字符串,而你现在拿到的r.text已经是字符串了,执行后data还是个字符串,自然没有.get()方法。- 你需要的是把JSON字符串转换成Python字典,应该用
json.loads(),或者更简单的requests内置的.json()方法。
修正后的客户端代码:
def grab_tweet(): return requests.post("http://gateway:8080/function/twittersend") r = grab_tweet() # 先确保请求成功 if r.ok: # 直接用r.json()解析响应为Python字典 data = r.json() return data.get('tweet') else: print(f"请求失败,状态码:{r.status_code}") return None
2. 解决根源:非标准JSON格式问题
你提到r.text返回的是{u'tweet': u'RT THIS IS THE TWEET BLAH BLAH…', u'language': u'en'},这不是标准JSON——标准JSON用双引号,也没有u前缀(那是Python 2里字符串的表示)。这说明你的本地服务返回的不是真正的JSON,而是Python字典的字符串表示(repr输出)。
修复本地服务的返回逻辑
你的本地读取函数现在直接返回了加载后的字典,导致服务框架把它转成了Python风格的字符串。需要改成返回标准JSON:
如果你的本地服务用的是Flask这类框架,用jsonify返回:
import json from flask import jsonify def your_local_service_function(): with open('jsonOutputfile.txt') as f: jsonObject = json.load(f) # jsonify会自动把字典转成标准JSON,并设置正确的Content-Type return jsonify(jsonObject)
如果是自定义的服务逻辑,手动序列化并设置响应头:
import json def your_local_service_function(): with open('jsonOutputfile.txt') as f: jsonObject = json.load(f) # 把字典转成标准JSON字符串 json_str = json.dumps(jsonObject) # 返回时设置Content-Type为application/json return json_str, 200, {'Content-Type': 'application/json'}
3. 验证步骤
- 先检查
jsonOutputfile.txt里的内容,确保是标准JSON(双引号,无u前缀):
正确的内容应该是:{"tweet": "RT THIS IS THE TWEET BLAH BLAH…", "language": "en"} - 用curl测试本地服务:
确认返回的是上面的标准JSON格式,而不是Python风格的字符串。curl http://gateway:8080/function/twittersend
这样调整后,客户端的.json()方法就能正确解析,.get('tweet')也能正常工作了。
内容的提问来源于stack exchange,提问作者cjnash
相关产品推荐
相关产品推荐

