【问题标题】:Passing the twitter search json response to a flask route that outputs json将 twitter 搜索 json 响应传递给输出 json 的烧瓶路由
【发布时间】:2015-09-04 12:47:03
【问题描述】:

我正在使用 python 库 python-twitter 来访问 twitter api。

我正在做一个搜索查询,并希望该响应进入我的烧瓶路线。

我得到了这个错误

TypeError: <twitter.status.Status object at 0x7f16dc089110> is not JSON serializable

这就是我所拥有的

@app.route('/t/search/tweets',  methods=['GET'])
def twit():
    results = twitter_api.GetSearch(count=count, term='hello world')
    return Response(json.dumps(results),  mimetype='application/json')

这是完整的引用

Traceback (most recent call last):
  File "/home/john/.virtualenvs/in5/lib/python2.7/site-packages/flask/app.py", line 1836, in __call__
    return self.wsgi_app(environ, start_response)
  File "/home/john/.virtualenvs/in5/lib/python2.7/site-packages/flask/app.py", line 1820, in wsgi_app
    response = self.make_response(self.handle_exception(e))
  File "/home/john/.virtualenvs/in5/lib/python2.7/site-packages/flask_cors/extension.py", line 110, in wrapped_function
    return cors_after_request(app.make_response(f(*args, **kwargs)))
  File "/home/john/.virtualenvs/in5/lib/python2.7/site-packages/flask/app.py", line 1403, in handle_exception
    reraise(exc_type, exc_value, tb)
  File "/home/john/.virtualenvs/in5/lib/python2.7/site-packages/flask/app.py", line 1817, in wsgi_app
    response = self.full_dispatch_request()
  File "/home/john/.virtualenvs/in5/lib/python2.7/site-packages/flask/app.py", line 1477, in full_dispatch_request
    rv = self.handle_user_exception(e)
  File "/home/john/.virtualenvs/in5/lib/python2.7/site-packages/flask_cors/extension.py", line 110, in wrapped_function
    return cors_after_request(app.make_response(f(*args, **kwargs)))
  File "/home/john/.virtualenvs/in5/lib/python2.7/site-packages/flask/app.py", line 1381, in handle_user_exception
    reraise(exc_type, exc_value, tb)
  File "/home/john/.virtualenvs/in5/lib/python2.7/site-packages/flask/app.py", line 1475, in full_dispatch_request
    rv = self.dispatch_request()
  File "/home/john/.virtualenvs/in5/lib/python2.7/site-packages/flask/app.py", line 1461, in dispatch_request
    return self.view_functions[rule.endpoint](**req.view_args)
  File "/home/john/Scripts/Python/in5/views.py", line 73, in twit
    return Response(json.dumps(results),  mimetype='application/json')
  File "/usr/lib/python2.7/json/__init__.py", line 243, in dumps
    return _default_encoder.encode(obj)
  File "/usr/lib/python2.7/json/encoder.py", line 207, in encode
    chunks = self.iterencode(o, _one_shot=True)
  File "/usr/lib/python2.7/json/encoder.py", line 270, in iterencode
    return _iterencode(o, 0)
  File "/usr/lib/python2.7/json/encoder.py", line 184, in default
    raise TypeError(repr(o) + " is not JSON serializable")
TypeError: <twitter.status.Status object at 0x7fc3d3384390> is not JSON serializable

这里是“打印结果”

[<twitter.status.Status object at 0x7ff1f3114f90>, <twitter.status.Status object at 0x7ff1f30c6050>, <twitter.status.Status object at 0x7ff1f30c6190>, <twitter.status.Status object at 0x7ff1f30c6310>, <twitter.status.Status object at 0x7ff1f30c6510>, <twitter.status.Status object at 0x7ff1f30c65d0>, <twitter.status.Status object at 0x7ff1f30c6690>, <twitter.status.Status object at 0x7ff1f30c67d0>, <twitter.status.Status object at 0x7ff1f30c69d0>, <twitter.status.Status object at 0x7ff1f30c6c10>, <twitter.status.Status object at 0x7ff1f30c6d90>, <twitter.status.Status object at 0x7ff1f30c6e50>, <twitter.status.Status object at 0x7ff1f30c90d0>, <twitter.status.Status object at 0x7ff1f30c91d0>, <twitter.status.Status object at 0x7ff1f30c9290>, <twitter.status.Status object at 0x7ff1f30c9410>, <twitter.status.Status object at 0x7ff1f30c95d0>, <twitter.status.Status object at 0x7ff1f30c9690>, <twitter.status.Status object at 0x7ff1f30c9750>, <twitter.status.Status object at 0x7ff1f30c9a10>, <twitter.status.Status object at 0x7ff1f30c9ad0>, <twitter.status.Status object at 0x7ff1f30c9c10>, <twitter.status.Status object at 0x7ff1f30c9dd0>, <twitter.status.Status object at 0x7ff1f30c9e90>, <twitter.status.Status object at 0x7ff1f30c9f90>, <twitter.status.Status object at 0x7ff1f30cf1d0>, <twitter.status.Status object at 0x7ff1f30cf290>, <twitter.status.Status object at 0x7ff1f30cf510>, <twitter.status.Status object at 0x7ff1f30cf5d0>, <twitter.status.Status object at 0x7ff1f30cf690>, <twitter.status.Status object at 0x7ff1f30cf810>, <twitter.status.Status object at 0x7ff1f30cf8d0>, <twitter.status.Status object at 0x7ff1f30cfa50>, <twitter.status.Status object at 0x7ff1f30cfc90>, <twitter.status.Status object at 0x7ff1f30cfed0>, <twitter.status.Status object at 0x7ff1f30cff90>, <twitter.status.Status object at 0x7ff1f30d6090>, <twitter.status.Status object at 0x7ff1f30d6210>, <twitter.status.Status object at 0x7ff1f30d6390>, <twitter.status.Status object at 0x7ff1f30d6590>, <twitter.status.Status object at 0x7ff1f30d66d0>, <twitter.status.Status object at 0x7ff1f30d6890>, <twitter.status.Status object at 0x7ff1f30d6990>, <twitter.status.Status object at 0x7ff1f30d6a10>, <twitter.status.Status object at 0x7ff1f30d6a90>, <twitter.status.Status object at 0x7ff1f30d6bd0>, <twitter.status.Status object at 0x7ff1f30d6c90>, <twitter.status.Status object at 0x7ff1f30d6e50>, <twitter.status.Status object at 0x7ff1f30dc050>, <twitter.status.Status object at 0x7ff1f30dc110>]

【问题讨论】:

  • 结果如何?向我们展示数据
  • 我的意思是results 变量。
  • 看看它是怎样一个推特状态对象的列表? python告诉你你不能把它们变成json
  • 但我不明白的是我从 api 得到了一个 json。还有一些地方 python 正在使它成为一个列表而不是一个 json

标签: python json twitter python-twitter


【解决方案1】:

我不得不挖掘他们的源代码,结果你必须使用AsDict()

json_results = [result.AsDict() for result in results]

好痛……

由于缺乏文档,我强烈建议使用 tweepy 而不是这个库。

【讨论】:

  • 但在 dev docs 上显示应用程序 json
  • 你能粘贴results的样子吗?
  • TypeError: is not JSON serializable
  • 改网址后没有变化,还是一样的错误
  • 你能打印出这些 twitter 对象到底是什么吗? for result in results: print result
【解决方案2】:

显然 python-twitter 已经将 api 调用结果反序列化为自定义 twitter.status.Status 对象(或列表)。默认情况下,json.dump() 只知道基本类型(字符串、数字、列表和字典),因此您必须为其他任何内容提供自己的编码器,如下所述:https://docs.python.org/2/library/json.html#encoders-and-decoders

您可能还想阅读以下内容:How to make a class JSON serializable

【讨论】:

  • 您可以使用instance.AsDict()。显然它没有写在他们的文档中的任何地方。 (我什至不认为他们有自己的文档......)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-09-11
  • 1970-01-01
  • 1970-01-01
  • 2015-01-14
  • 2019-01-19
  • 2017-02-28
  • 1970-01-01
相关资源
最近更新 更多