【问题标题】:Convert tweepy JSON object to dict将 tweepy JSON 对象转换为 dict
【发布时间】:2017-02-11 23:24:53
【问题描述】:

我想将 Tweepy api.trends_location(woeid) 调用的结果转换为 dict(或 dicts 的 dict),这样我就可以处理这些值(真的,我想得到一个 '名称的值)。 Tweepy 文档说结果是“一个 JSON 对象”(see here),但是当我检索它时,type(retrieved) 的计算结果为list。果然,retrievedlen 为 1,retrieved[0] 给了我一个单项:
[{'trends': [{'url': 'http://search.twitter.com/search?q=%23questionsidontlike', 'query': '%23questionsidontlike', 'events': None, 'promoted_content': None, 'name': '#questionsidontlike'}, ], (more of the same), 'created_at': '2011-01-31T22:39:16Z', 'as_of': '2011-01-31T22:47:47Z', 'locations': [{'woeid': 23424977, 'name': 'United States'}]}]

我可以调用json.dumps,它会给出一个格式很好的表示,但这对我来说用处不大,json.loads 给了我:__init__() got an unexpected keyword argument 'sort_keys'

我应该如何进行?

完整代码链接:https://gist.github.com/805129

【问题讨论】:

  • Python 中的 JSON 对象实际上是使用 listdict 对象表示的。 dict 用于对象,list 用于数组。你到底想做什么?
  • 我明白这一点,但在这种情况下,只有一个成员的列表,即整个结果并没有多大用处。我想将 'name' 的值提取到他们自己的列表中。

标签: python tweepy


【解决方案1】:

好的,应该这样做!它甚至已经过测试(感谢发布附加信息)。

>>> names = [trend["name"] for trend in retrieved[0]["trends"]]
>>> names
['#wishuwould', '#questionsidontlike', '#februarywish', 'Purp & Patron', 'Egyptians', 'Kool Herc', 'American Pie', 'Judge Vinson', 'Eureka Nutt', 'Eddie House']

我认为大部分混淆来自将输出称为 JSON 对象的文档,这与需要使用 json 模块转换的 JSON 字符串不同。

这是如何工作的:retrieved 是一个包含单个项目的列表,它是包含 trends 键的字典,所以 retrieved[0]["trends"] 是趋势字典的列表,其中每个趋势字典都包含 @987654327 @你感兴趣的键。

【讨论】:

  • 我很快尝试了这个,但我只得到'0'作为检索[0][0]的输出,所以发生了一些奇怪的事情。已编辑带有完整代码链接的原件。
  • 好吧,看起来输出仍然是字符串格式,我原以为它已经转换为 Python 对象。试试json.loads(retrieved[0]) 看看是否可行,我将开始编辑我的评论。
  • 嗯,json.loads(retrieved[0]) 给了我一个“预期的字符串或缓冲区”错误,而 json.loads(str(retrieved[0])) 给了我“预期的属性名称” : 第 1 行第 1 列 (char 1)'
  • 好吧,我想我的理论是错误的,你能把print retrieved 的全部输出贴出来吗?在这里或在 github 上。
  • 好的,取得一些进展:type(retrieved[0]) 是一个字典。这是检索到的输出(单击原始以正确查看):gist.github.com/805173
【解决方案2】:

这样的东西对你有用吗?

def searchKeys(struct, keys, result = None, recursive = True):
        if result is None:
                result = []

        if isinstance(struct, dict):
                for k in keys:
                        if struct.has_key(k):
                                result.append(struct[k])

                if recursive:
                        for i in struct.values():
                                searchKeys(struct = i, keys = keys, result = result, recursive = recursive)
        elif isinstance(struct, list):
                if recursive:
                        for i in struct:
                                searchKeys(struct = i, keys = keys, result = result, recursive = recursive)

        return result

使用示例:

>>> searchKeys(struct = a, keys = ['name'])
['United States', '#questionsidontlike']

它递归地遍历dict/list 层次结构,搜索一组dict 键并将相应的值存储到list

【讨论】:

    【解决方案3】:

    要将 Tweepy 'Status' 对象转换为 Python 字典 (JSON),请访问对象上的私有成员“_json”。

    tweets = tweepy_api.user_timeline(screen_name='seanharr11')
    json_tweets = map(lambda t: t._json, tweets)
    

    【讨论】:

      【解决方案4】:
      >>> import simplejson
      >>> a = {"response":[{"message":"ok"},{"message":"fail"}]}
      >>> json = simplejson.dumps(a)
      >>> simplejson.loads(json)
      {'response': [{'message': 'ok'}, {'message': 'fail'}]}
      

      http://docs.python.org/library/json.html

      【讨论】:

        猜你喜欢
        • 2015-03-10
        • 2018-01-08
        • 2019-02-03
        • 2017-04-27
        • 1970-01-01
        • 1970-01-01
        • 2019-10-08
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多