【发布时间】:2014-10-26 03:19:49
【问题描述】:
我正在尝试使用 Python 3 的内置 JSON 模块进行一些简单的 JSON 解析,并且通过阅读有关 SO 和谷歌搜索的一堆其他问题,这似乎应该非常简单。但是,我认为我得到的是返回的字符串而不是预期的字典。
首先,这是我试图从中获取值的 JSON。这只是 Twitter API 的一些输出
[{'in_reply_to_status_id_str': None, 'in_reply_to_screen_name': None, 'retweeted': False, 'in_reply_to_status_id': None, 'contributors': None, 'favorite_count': 0, 'in_reply_to_user_id': None, 'coordinates': None, 'source': '<a href="http://twitter.com" rel="nofollow">Twitter Web Client</a>', 'geo': None, 'retweet_count': 0, 'text': 'Tweeting a url \nhttp://t.co/QDVYv6bV90', 'created_at': 'Mon Sep 01 19:36:25 +0000 2014', 'entities': {'symbols': [], 'user_mentions': [], 'urls': [{'expanded_url': 'http://www.isthereanappthat.com', 'display_url': 'isthereanappthat.com', 'url': 'http://t.co/QDVYv6bV90', 'indices': [16, 38]}], 'hashtags': []}, 'id_str': '506526005943865344', 'in_reply_to_user_id_str': None, 'truncated': False, 'favorited': False, 'lang': 'en', 'possibly_sensitive': False, 'id': 506526005943865344, 'user': {'profile_text_color': '333333', 'time_zone': None, 'entities': {'description': {'urls': []}}, 'url': None, 'profile_background_image_url': 'http://abs.twimg.com/images/themes/theme1/bg.png', 'profile_background_image_url_https': 'https://abs.twimg.com/images/themes/theme1/bg.png', 'protected': False, 'default_profile_image': True, 'utc_offset': None, 'default_profile': True, 'screen_name': 'KickzWatch', 'follow_request_sent': False, 'following': False, 'profile_background_color': 'C0DEED', 'notifications': False, 'description': '', 'profile_sidebar_border_color': 'C0DEED', 'geo_enabled': False, 'verified': False, 'friends_count': 40, 'created_at': 'Mon Sep 01 16:29:18 +0000 2014', 'is_translator': False, 'profile_sidebar_fill_color': 'DDEEF6', 'statuses_count': 4, 'location': '', 'id_str': '2784389341', 'followers_count': 4, 'favourites_count': 0, 'contributors_enabled': False, 'is_translation_enabled': False, 'lang': 'en', 'profile_image_url': 'http://abs.twimg.com/sticky/default_profile_images/default_profile_6_normal.png', 'profile_image_url_https': 'https://abs.twimg.com/sticky/default_profile_images/default_profile_6_normal.png', 'id': 2784389341, 'profile_use_background_image': True, 'listed_count': 0, 'profile_background_tile': False, 'name': 'Maktub Destiny', 'profile_link_color': '0084B4'}, 'place': None}]
我将此字符串分配给一个名为 json_string 的变量,如下所示:
json_string = json.dumps(output)
jason = json.loads(json_string)
然后,当我尝试从“jason”字典中获取特定键时:
print(jason['hashtags'])
我收到一个错误:
TypeError: string indices must be integers
我希望能够将 json 输出转换为字典,然后使用 jason[key_name] 调用使用指定键获取值。我在这里有什么明显的遗漏吗?
这是我从 Java 毕业后第一次使用 Python。我非常喜欢这种语言,并认为它非常强大。因此,我们将不胜感激任何帮助!
【问题讨论】:
-
1) 您粘贴的数据是 Python 数据结构,而不是 JSON。 2) 外部数据结构是list,而不是字典。
-
@LukasGraf 嗯,很有趣。所以它是一个包含字典的列表?我只是注释掉了 json 逻辑,只是尝试了 output[0]['hashtags'] 没有运气。在这种情况下,“输出”是调用返回的 Python 数据结构。关于如何解决这个问题的任何想法?
-
正如其他人指出的那样,您的 JSON 输入将在 Python 中变为
list,而不是dict。此外,由于缺少右括号,您提供的代码 sn-pprint(jason['hashtags']甚至不是有效的 Python。请发布一个语法正确的示例及其输出,以便我们确定是什么代码产生了什么错误。 -
我得到一个不同的错误:
TypeError: list indices must be integers, not str。这就是我所期望的:结果对象是一个列表,而不是一个字符串。>>> import json >>> json_string = json.dumps(output) >>> jason = json.loads(json_string) >>> print(jason['hashtags']) Traceback (most recent call last): File "<stdin>", line 1, in <module> TypeError: list indices must be integers, not str -
这也甚至不是有效的 JSON,它只允许双引号字符串,不允许单引号字符串。
标签: python json parsing dictionary