Python Json loads()返回字符串而不是字典?

Python Json loads()返回字符串而不是字典?,python,json,parsing,dictionary,Python,Json,Parsing,Dictionary,我正在尝试使用Python3内置的JSON模块进行一些简单的JSON解析,通过阅读SO和Google上的一系列其他问题,看起来这应该是非常简单的。但是,我认为返回的是字符串,而不是预期的字典 首先,这里是我试图从中获取值的JSON。这只是Twitter API的一些输出 [{'in_reply_to_status_id_str': None, 'in_reply_to_screen_name': None, 'retweeted': False, 'in_reply_to_status_

我正在尝试使用Python3内置的JSON模块进行一些简单的JSON解析,通过阅读SO和Google上的一系列其他问题,看起来这应该是非常简单的。但是,我认为返回的是字符串,而不是预期的字典

首先,这里是我试图从中获取值的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}]
然后,当我试图从“jason”字典中获取特定密钥时:

print(jason['hashtags'])
我得到一个错误:

TypeError: string indices must be integers
我希望能够将json输出转换为字典,然后使用
jason[key\u name]
call使用指定的键获取值。这里有什么明显的我遗漏的吗


这是我从Java毕业后第一次使用Python。我绝对喜欢这门语言,认为它非常强大。因此,在此方面的任何帮助都将不胜感激

首先,您的JSON示例不是有效的JSON;twitterapi不会输出这个,因为它会破坏每个符合JSON的消费者

  • 显示第一个明显的语法错误:单引号字符串而不是双引号字符串
  • 其次,您有
    None
    ,其中JSON需要
    null
    False
    而不是
    False
    ,以及
    True
    ,而不是
    True
您所谓的“JSON”示例似乎已预解码为Python:)。当我使用一段真正的JSON时,它完全按照预期工作:

import json

json_string = r"""
[{"actual_json_key":"actual_json_value"}]
"""

jason = json.loads(json_string)

print(jason[0]["actual_json_key"])

好的,首先您应该打印您的对象,以便您可以阅读它:

>>> from pprint import pprint
>>> output = [{'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}]
>>> pprint(output)
[{'contributors': None,
  'coordinates': None,
  'created_at': 'Mon Sep 01 19:36:25 +0000 2014',
  'entities': {'hashtags': [],
               'symbols': [],
               'urls': [{'display_url': 'isthereanappthat.com',
                         'expanded_url': 'http://www.isthereanappthat.com',
                         'indices': [16, 38],
                         'url': 'http://t.co/QDVYv6bV90'}],
               'user_mentions': []},
  'favorite_count': 0,
  'favorited': False,
  'geo': None,
  'id': 506526005943865344,
  'id_str': '506526005943865344',
  'in_reply_to_screen_name': None,
  'in_reply_to_status_id': None,
  'in_reply_to_status_id_str': None,
  'in_reply_to_user_id': None,
  'in_reply_to_user_id_str': None,
  'lang': 'en',
  'place': None,
  'possibly_sensitive': False,
  'retweet_count': 0,
  'retweeted': False,
  'source': '<a href="http://twitter.com" rel="nofollow">Twitter Web Client</a>',
  'text': 'Tweeting a url \nhttp://t.co/QDVYv6bV90',
  'truncated': False,
  'user': {'contributors_enabled': False,
           'created_at': 'Mon Sep 01 16:29:18 +0000 2014',
           'default_profile': True,
           'default_profile_image': True,
           'description': '',
           'entities': {'description': {'urls': []}},
           'favourites_count': 0,
           'follow_request_sent': False,
           'followers_count': 4,
           'following': False,
           'friends_count': 40,
           'geo_enabled': False,
           'id': 2784389341,
           'id_str': '2784389341',
           'is_translation_enabled': False,
           'is_translator': False,
           'lang': 'en',
           'listed_count': 0,
           'location': '',
           'name': 'Maktub Destiny',
           'notifications': False,
           'profile_background_color': 'C0DEED',
           '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',
           'profile_background_tile': False,
           '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',
           'profile_link_color': '0084B4',
           'profile_sidebar_border_color': 'C0DEED',
           'profile_sidebar_fill_color': 'DDEEF6',
           'profile_text_color': '333333',
           'profile_use_background_image': True,
           'protected': False,
           'screen_name': 'KickzWatch',
           'statuses_count': 4,
           'time_zone': None,
           'url': None,
           'utc_offset': None,
           'verified': False}}]
您还将看到
第一元素中的
hashtags
键包含在键
实体下的第二级
目录中:

>>> entities = first_elem['entities']
>>> pprint(entities)
{'hashtags': [],
 'symbols': [],
 'urls': [{'display_url': 'isthereanappthat.com',
           'expanded_url': 'http://www.isthereanappthat.com',
           'indices': [16, 38],
           'url': 'http://t.co/QDVYv6bV90'}],
 'user_mentions': []}
现在您可以访问hashtags

>>> entities['hashtags']
[]
正好是空名单

要转换为JSON,请注意注释:

>>> import json
>>> # Make sure output is the list object not a string representing the object
>>> json_string = json.dumps(output)
>>> jason = json.loads(output)
>>> jason[0]['entities']['hashtags']
[]
我认为您的问题在于,您在
json.dumps
之前将输出设置为字符串,这意味着
json.loads
将返回字符串,而不是json对象


@Dan的答案是正确的,这不是有效的JSON。但是,它是一个有效的python dict,我假设您使用python从Twitter上获得它,然后将其打印出来。

1)您粘贴的数据是python数据结构,而不是JSON。2) 外部数据结构是一个列表,而不是一个字典。@LukasGraf Hmmm,很有趣。那么它是一个包含字典的列表?我只是注释掉了json逻辑,只是尝试了输出[0]['hashtags'],但没有成功。本例中的“output”是调用返回的Python数据结构。关于如何处理这个问题有什么想法吗?正如其他人指出的,您的JSON输入将成为Python中的
列表,而不是
dict
。另外,您给出的代码片段,
print(jason['hashtags']
,由于缺少右括号,甚至不是有效的Python。请发布一个语法正确的示例及其输出,以便我们可以确定是什么代码产生了什么错误。我得到了一个不同的错误:
TypeError:list index必须是整数,而不是str
。这就是我所期望的:结果对象是list,而不是s字符串。
>>>导入json>>json\u string=json.dumps(输出)>>>jason=json.loads(json\u string)>>>打印(jason['hashtags'])回溯(最近一次调用):文件“”,第1行,在TypeError中:列表索引必须是整数,而不是str
这甚至不是有效的JSON,它只允许双引号字符串,而不允许单引号字符串。他的问题是,他将一个已经是Python的结果编码回JSON,然后再返回Python,然后遇到另一个不相关的问题;-)我将恢复对问题的编辑-如果问题保持原来的形式,你的答案会更有意义。@Lukas。。。如果你想学技术的话…:PIn short,
dict
-->
json_dumps()
-->
json_loads()
将返回dict。
string
-->
json_dumps()
将返回字符串。你付出的就是你得到的。这是因果报应。
>>> entities['hashtags']
[]
>>> import json
>>> # Make sure output is the list object not a string representing the object
>>> json_string = json.dumps(output)
>>> jason = json.loads(output)
>>> jason[0]['entities']['hashtags']
[]