Iterasi melalui objek JSON

109

Saya mencoba melakukan iterasi melalui objek JSON untuk mengimpor data, yaitu judul dan tautan. Sepertinya saya tidak bisa mendapatkan konten yang sudah lewat :.

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
    }
]

Saya mencoba menggunakan kamus:

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

Kode ini hanya mencetak informasi sebelumnya :. ( abaikan lagu Justin Bieber :))

myusuf3
sumber

Jawaban:

79

Pemuatan data JSON Anda sedikit rapuh. Dari pada:

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

Anda harus benar-benar melakukan:

json_object = json.load(raw)

Anda tidak boleh menganggap apa yang Anda dapatkan sebagai "objek JSON". Apa yang Anda miliki adalah sebuah daftar. Daftar itu berisi dua penis. Dadu berisi berbagai pasangan kunci / nilai, semua string. Saat Anda melakukannya json_object[0], Anda meminta dikt pertama dalam daftar. Ketika Anda mengulanginya, dengan for song in json_object[0]:, Anda mengulangi tombol dari dict. Karena itulah yang Anda dapatkan saat Anda mengulang dikt. Jika Anda ingin mengakses nilai yang terkait dengan kunci dalam dikt tersebut, Anda akan menggunakan, misalnya json_object[0][song],.

Tak satu pun dari ini khusus untuk JSON. Ini hanya jenis Python dasar, dengan operasi dasarnya seperti yang tercakup dalam tutorial apa pun.

Thomas Wouters
sumber
saya tidak mengerti. Saya mencoba mengulangi apa yang Anda katakan di luar batas. Saya cukup yakin ini adalah pertanyaan tentang json
myusuf3
7
Tidak. Saya beritahu Anda bahwa mengulang dikt memberi Anda kuncinya. Jika Anda ingin mengulang sesuatu yang lain, Anda harus mengulanginya lagi. Anda tidak mengatakan apa yang ingin Anda ulangi. Tutorial Python akan menjadi tempat yang baik untuk mencari tahu apa yang dapat Anda iterasi, dan apa yang akan dilakukannya.
Thomas Wouters
5
Sayangnya agak sulit untuk menjelaskan semua cara Anda dapat mengekstrak data dari daftar dan kamus dan string dalam 600 karakter yang dapat Anda masukkan ke dalam komentar. Saya sudah mengatakan Anda harus mengindeks dict untuk mendapatkan nilai yang terkait dengan sebuah kunci. Saya tidak yakin apa yang ingin Anda ulangi. Mempelajari tentang jenis Python bawaan adalah langkah selanjutnya.
Thomas Wouters
Tidak banyak iterasi yang terlibat saat Anda ingin mendapatkan item satu per satu. Mungkin yang ingin Anda ulangi adalah json_object, bukan json_object[0], lalu dapatkan item individual dari setiap dict.
Thomas Wouters
101

Saya yakin Anda mungkin bermaksud:

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: Anda bisa menggunakan song.iteritemsbukan song.itemsjika di Python 2.

tzot.dll
sumber
untuk atribut, nilai dalam song.iteritems (): apa arti koma di baris ini?
zakdances
Itu sama dengan for (attribute, value) in song.iteritems():, atau (var1, var2) = (1, 2)atau var1, var2 = 1, 2. dict.iteritems()menghasilkan (key, value)pasangan (tupel). Cari “python tuple unpacking”.
tzot
1
Untuk python 3, ubah song.iteritemske song.items.
Big Pumpkin
44

Pertanyaan ini sudah lama ada di sini, tetapi saya ingin berkontribusi bagaimana saya biasanya mengulang melalui objek JSON. Dalam contoh di bawah ini, saya telah menunjukkan string hard-code yang berisi JSON, tetapi string JSON bisa dengan mudah berasal dari layanan web atau file.

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
sumber
2
Tidak ada string yang menyisipkan kode di atas; jsonObjectadalah a dict. Dalam kode di atas, saya lebih suka for key, value in jsonObject.items():.
tzot
22

Setelah deserialisasi JSON, Anda memiliki objek python. Gunakan metode objek biasa.

Dalam hal ini Anda memiliki daftar kamus:

json_object[0].items()

json_object[0]["title"]

dll.

jcea
sumber
8

Saya akan menyelesaikan masalah ini lebih seperti ini

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
sumber
3

untuk iterasi melalui JSON Anda dapat menggunakan ini:

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
sumber
2

Untuk Python 3, Anda harus mendekode data yang Anda dapatkan kembali dari server web. Misalnya saya memecahkan kode data sebagai utf8 lalu menanganinya:

 # 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

Jika Anda tidak mendekode, Anda akan mendapatkan byte vs kesalahan string di Python 3.

jamescampbell
sumber