将tweepy JSON对象转换为字典

3 投票
4 回答
5030 浏览
提问于 2025-04-16 10:58

我想把Tweepy的一个调用结果 api.trends_location(woeid) 转换成字典(或者字典的字典),这样我就可以处理这些值了(其实我想得到的是一个包含'name'值的字典)。Tweepy的文档说结果是“一个JSON对象”(可以查看这里),但是当我获取到结果时,type(retrieved) 的结果是 list。确实,retrieved 的长度是1,而 retrieved[0] 给我的是一个单一的项目:
[{'trends': [{'url': 'http://search.twitter.com/search?q=%23questionsidontlike', 'query': '%23questionsidontlike', 'events': None, 'promoted_content': None, 'name': '#questionsidontlike'}, ], (还有更多类似的内容), '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

相关问题:

4 个回答

1

要把Tweepy的'Status'对象转换成Python字典(也就是JSON格式),你只需要访问这个对象的一个私有成员"_json"。

tweets = tweepy_api.user_timeline(screen_name='seanharr11')
json_tweets = map(lambda t: t._json, tweets)
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)的层级结构,寻找一组字典的键,并把对应的值存储到一个列表中。

3

好的,这个应该可以解决问题!而且已经测试过了(感谢你提供的额外信息)。

>>> 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字符串需要用json模块进行转换。

这个是怎么回事呢:retrieved是一个列表,里面只包含一个项目,这个项目是一个字典,字典里有一个trends的键。所以retrieved[0]["trends"]就是趋势字典的列表,每个趋势字典里都有你感兴趣的name键。

撰写回答