Python-Json lädt() Rückgabe string statt Wörterbuch?
Ich versuche zu tun, einige einfache JSON Parsen mit Python 3 gebaut im JSON-Modul, und aus der Lektüre ein paar andere Fragen auf, SO und googeln, es scheint, dass das ist eigentlich ziemlich einfach. Ich denke aber, ich bin immer ein string zurückgegeben, statt der erwarteten Wörterbuch.
Erstens, hier ist die JSON-ich bin versucht, um Werte aus. Es ist nur eine Ausgabe aus der 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" >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}]
Wies ich diesen String in eine variable namens json_string etwa so:
json_string = json.dumps(output)
jason = json.loads(json_string)
Dann, wenn ich versuche, zu bekommen einen bestimmten Schlüssel aus den "jason" - Wörterbuch:
print(jason['hashtags'])
Ich erhalte eine Fehlermeldung:
TypeError: string indices must be integers
Ich möchte in der Lage sein, zum konvertieren der json-Ausgabe für ein Wörterbuch, dann verwenden Sie jason[key_name]
aufrufen, um Werte mithilfe der angegebenen Tasten. Gibt es etwas offensichtlich, dass ich hier fehlen?
Dies ist meine erste Zeit der Arbeit mit Python, nachdem er von Java. Ich Liebe die Sprache und denke, es ist sehr mächtig. Also, jede Hilfe auf diesem würde sehr geschätzt werden!
Hmmm, interessant. Es ist also eine Liste mit einem Wörterbuch? Ich habe nur kommentiert das json-Logik und einfach nur versuchte, Ausgabe[0]['hashtags'] mit kein Glück. "Ausgabe" in diesem Fall wird die Python-Datenstruktur zurückgegeben, die von der call. Irgendwelche Gedanken auf, wie man diesen Ansatz?
Wie andere darauf hingewiesen, Ihre JSON-Eingabe wird ein
list
in Python, nicht ein dict
. Darüber hinaus ist der code-snippet, das Sie gab, print(jason['hashtags']
ist auch nicht gültig Python durch das fehlen einer schließenden Klammer. Bitte posten Sie ein syntaktisch korrektes Beispiel mit Ihrer Leistung, so können wir sicher sein, was code produziert, welcher Fehler.Ich bekomme eine andere Fehlermeldung:
TypeError: list indices must be integers, not str
. Und das ist, was ich erwarten würde: das resultierende Objekt ist eine Liste, kein string. >>> 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
Dies ist auch nicht auch gültiges JSON, das ermöglicht nur double-quoted strings, und nicht single-quoted strings.
InformationsquelleAutor Jade Byfield | 2014-09-01
Du musst angemeldet sein, um einen Kommentar abzugeben.
Erstmal Ok drucken Sie Ihr Objekt so, dass Sie es Lesen können:
Aus der Suche in diesem können Sie sehen, dass die Ausgabe auf ein
list
enthält eine einzigedict
. Um auf diese zuzugreifen, benötigen Sie:Werden Sie auch sehen, dass die
hashtags
Schlüssel in derfirst_elem
enthalten ist, in eine zweite Ebenedict
unter dem Schlüsselentities
:Nun sind Sie in der Lage, Zugang
hashtags
:Was passiert einfach die leere Liste.
Umwandeln, JSON, notieren Sie den Kommentar:
Ich glaube, dein problem ist, dass Sie aus der Ausgabe einer Zeichenfolge, bevor Sie
json.dumps
es, was bedeutet, dassjson.loads
wird ein string zurückgegeben, nicht ein json-Objekt.Und @Dan, die Antwort ist korrekt, dies ist kein gültiges JSON. Es ist jedoch ein Gültiger python dict, und ich nehme an, Sie haben es von Twitter mit python dann gedruckt.
Ich werde zurückkehren, meine Bearbeitung der Frage - deine Antwort macht viel mehr Sinn, wenn man die Frage bleibt in seiner ursprünglichen form.
gut, wenn du willst... 😛
In kurzen,
dict
-->json_dumps()
-->json_loads()
werden Sie wieder dict.string
-->json_dumps()
-->json_loads()
werden Sie wieder string. Was Sie geben, ist, was Sie erhalten. Dies ist Karma.InformationsquelleAutor Yep_It's_Me
First off, Ihre JSON-Beispiel ist kein gültiges JSON; die Twitter-API würde nicht ausgegeben, denn es würde brechen jedes JSON-konforme Verbraucher.
None
wo JSON erfordertnull
,False
stattfalse
, undTrue
statttrue
.Ihre angeblichen "JSON" Beispiel scheint für die pre-decoded into Python :). Wenn ich mit einem snippet von real JSON, es funktioniert genau wie erwartet:
InformationsquelleAutor Dan Lenski