Durch ein JSON-Objekt iterieren

106

Ich versuche, ein JSON-Objekt zu durchlaufen, um Daten zu importieren, dh Titel und Link. Ich kann anscheinend nicht zu dem Inhalt gelangen, der hinter dem liegt :.

JSON:

[
    {
        "title": "Baby (Feat. Ludacris) - Justin Bieber",
        "description": "Baby (Feat. Ludacris) by Justin Bieber on Grooveshark",
        "link": "http://listen.grooveshark.com/s/Baby+Feat+Ludacris+/2Bqvdq",
        "pubDate": "Wed, 28 Apr 2010 02:37:53 -0400",
        "pubTime": 1272436673,
        "TinyLink": "http://tinysong.com/d3wI",
        "SongID": "24447862",
        "SongName": "Baby (Feat. Ludacris)",
        "ArtistID": "1118876",
        "ArtistName": "Justin Bieber",
        "AlbumID": "4104002",
        "AlbumName": "My World (Part II);\nhttp://tinysong.com/gQsw",
        "LongLink": "11578982",
        "GroovesharkLink": "11578982",
        "Link": "http://tinysong.com/d3wI"
    },
    {
        "title": "Feel Good Inc - Gorillaz",
        "description": "Feel Good Inc by Gorillaz on Grooveshark",
        "link": "http://listen.grooveshark.com/s/Feel+Good+Inc/1UksmI",
        "pubDate": "Wed, 28 Apr 2010 02:25:30 -0400",
        "pubTime": 1272435930
    }
]

Ich habe versucht, ein Wörterbuch zu verwenden:

def getLastSong(user,limit):
    base_url = 'http://gsuser.com/lastSong/'
    user_url = base_url + str(user) + '/' + str(limit) + "/"
    raw = urllib.urlopen(user_url)
    json_raw= raw.readlines()
    json_object = json.loads(json_raw[0])

    #filtering and making it look good.
    gsongs = []
    print json_object
    for song in json_object[0]:   
        print song

Dieser Code druckt nur die vorherigen Informationen :. ( ignoriere den Justin Bieber Track :))

myusuf3
quelle

Antworten:

78

Das Laden der JSON-Daten ist etwas fragil. Anstatt:

json_raw= raw.readlines()
json_object = json.loads(json_raw[0])

Sie sollten wirklich nur tun:

json_object = json.load(raw)

Sie sollten sich nicht vorstellen, was Sie als "JSON-Objekt" erhalten. Was Sie haben, ist eine Liste. Die Liste enthält zwei Diktate. Die Diktate enthalten verschiedene Schlüssel / Wert-Paare, alle Zeichenfolgen. Wenn Sie dies tun json_object[0], fragen Sie nach dem ersten Diktat in der Liste. Wenn Sie darüber iterieren for song in json_object[0]:, iterieren Sie mit über die Schlüssel des Diktats. Denn das bekommen Sie, wenn Sie über das Diktat iterieren. Wenn Sie auf den Wert zugreifen möchten, der dem Schlüssel in diesem Diktat zugeordnet ist, verwenden Sie beispielsweise json_object[0][song].

Nichts davon ist spezifisch für JSON. Es sind nur grundlegende Python-Typen, deren grundlegende Operationen in jedem Tutorial behandelt werden.

Thomas Wouters
quelle
Ich verstehe es nicht. Ich habe versucht, durch das zu iterieren, was dein Sprichwort außerhalb der Grenzen sagt. Ich bin mir ziemlich sicher, dass es eine Frage zu json ist
myusuf3
7
Ich sage Ihnen, dass das Durchlaufen des Diktats Ihnen die Schlüssel gibt. Wenn Sie über etwas anderes iterieren möchten, müssen Sie über etwas anderes iterieren. Sie haben nicht gesagt, worüber Sie iterieren möchten. Ein Python-Tutorial ist ein guter Ort, um herauszufinden, worüber Sie iterieren können und was es tun würde.
Thomas Wouters
5
Leider ist es etwas schwierig zu erklären, wie Sie Daten aus Listen, Wörterbüchern und Zeichenfolgen in den 600 Zeichen extrahieren können, die Sie in einen Kommentar einfügen können. Ich habe bereits gesagt, Sie sollten das Diktat indizieren, um den mit einem Schlüssel verknüpften Wert zu erhalten. Ich bin mir nicht sicher, worüber Sie iterieren möchten. Das Erlernen der integrierten Python-Typen ist der nächste Schritt.
Thomas Wouters
Es ist nicht viel Iteration erforderlich, wenn Sie einzelne Elemente erhalten möchten. Vielleicht , was Sie wollen iterieren ist json_object, nicht json_object[0], und dann bekommen einzelne Elemente aus den einzelnen dict.
Thomas Wouters
99

Ich glaube, Sie meinten wahrscheinlich:

from __future__ import print_function

for song in json_object:
    # now song is a dictionary
    for attribute, value in song.items():
        print(attribute, value) # example usage

NB: Sie können song.iteritemsanstelle von song.itemsif in Python 2 verwenden.

tzot
quelle
für Attribut Wert in song.iteritems (): Was bedeutet das Komma in dieser Zeile?
Zakdances
Es ist das gleiche wie for (attribute, value) in song.iteritems():oder (var1, var2) = (1, 2)oder var1, var2 = 1, 2. dict.iteritems()erzeugt (key, value)Paare (Tupel). Suchen Sie nach "Python Tuple Unpacking".
Zot
1
Wechseln Sie für Python 3 song.iteritemszu song.items.
Big Pumpkin
44

Diese Frage ist schon lange hier draußen, aber ich wollte dazu beitragen, wie ich normalerweise durch ein JSON-Objekt iteriere. Im folgenden Beispiel habe ich eine fest codierte Zeichenfolge gezeigt, die den JSON enthält, aber die JSON-Zeichenfolge könnte genauso gut von einem Webdienst oder einer Datei stammen.

import json

def main():

    # create a simple JSON array
    jsonString = '{"key1":"value1","key2":"value2","key3":"value3"}'

    # change the JSON string into a JSON object
    jsonObject = json.loads(jsonString)

    # print the keys and values
    for key in jsonObject:
        value = jsonObject[key]
        print("The key and value are ({}) = ({})".format(key, value))

    pass

if __name__ == '__main__':
    main()
Dale Moore
quelle
2
Der obige Code enthält keine Zeichenfolgenabonnements. jsonObjectist ein dict. Im obigen Code würde ich es vorziehen for key, value in jsonObject.items():.
Zot
22

Nach dem Deserialisieren des JSON haben Sie ein Python-Objekt. Verwenden Sie die regulären Objektmethoden.

In diesem Fall haben Sie eine Liste mit Wörterbüchern:

json_object[0].items()

json_object[0]["title"]

etc.

jcea
quelle
8

Ich würde dieses Problem eher so lösen

import json
import urllib2

def last_song(user, limit):
    # Assembling strings with "foo" + str(bar) + "baz" + ... generally isn't 
    # as nice as using real string formatting. It can seem simpler at first, 
    # but leaves you less happy in the long run.
    url = 'http://gsuser.com/lastSong/%s/%d/' % (user, limit)

    # urllib.urlopen is deprecated in favour of urllib2.urlopen
    site = urllib2.urlopen(url)

    # The json module has a function load for loading from file-like objects, 
    # like the one you get from `urllib2.urlopen`. You don't need to turn 
    # your data into a string and use loads and you definitely don't need to 
    # use readlines or readline (there is seldom if ever reason to use a 
    # file-like object's readline(s) methods.)
    songs = json.load(site)

    # I don't know why "lastSong" stuff returns something like this, but 
    # your json thing was a JSON array of two JSON objects. This will 
    # deserialise as a list of two dicts, with each item representing 
    # each of those two songs.
    #
    # Since each of the songs is represented by a dict, it will iterate 
    # over its keys (like any other Python dict). 
    baby, feel_good = songs

    # Rather than printing in a function, it's usually better to 
    # return the string then let the caller do whatever with it. 
    # You said you wanted to make the output pretty but you didn't 
    # mention *how*, so here's an example of a prettyish representation
    # from the song information given.
    return "%(SongName)s by %(ArtistName)s - listen at %(link)s" % baby
Mike Graham
quelle
2

Für Python 3 müssen Sie die Daten dekodieren, die Sie vom Webserver zurückerhalten. Zum Beispiel dekodiere ich die Daten als utf8 und beschäftige mich dann damit:

 # example of json data object group with two values of key id
jsonstufftest = '{'group':{'id':'2','id':'3'}}
 # always set your headers
headers = {'User-Agent': 'Moz & Woz'}
 # the url you are trying to load and get json from
url = 'http://www.cooljson.com/cooljson.json'
 # in python 3 you can build the request using request.Request
req = urllib.request.Request(url,None,headers)
 # try to connect or fail gracefully
try:
    response = urllib.request.urlopen(req) # new python 3 code -jc
except:
    exit('could not load page, check connection')
 # read the response and DECODE
html=response.read().decode('utf8') # new python3 code
 # now convert the decoded string into real JSON
loadedjson = json.loads(html)
 # print to make sure it worked
print (loadedjson) # works like a charm
 # iterate through each key value
for testdata in loadedjson['group']:
    print (accesscount['id']) # should print 2 then 3 if using test json

Wenn Sie nicht dekodieren, werden in Python 3 Bytes und Zeichenfolgenfehler angezeigt.

Jamescampbell
quelle
2

Zum Durchlaufen von JSON können Sie Folgendes verwenden:

json_object = json.loads(json_file)
for element in json_object: 
    for value in json_object['Name_OF_YOUR_KEY/ELEMENT']:
        print(json_object['Name_OF_YOUR_KEY/ELEMENT']['INDEX_OF_VALUE']['VALUE'])
Keivan
quelle