JSON nesnesi üzerinden yineleme


111

Verileri, yani başlık ve bağlantıyı içe aktarmak için bir JSON nesnesi üzerinden yinelemeye çalışıyorum. Geçmiş içeriğe ulaşamıyorum :.

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

Bir sözlük kullanmayı denedim:

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

Bu kod yalnızca önceki bilgileri yazdırır :. ( Justin Bieber parçasını görmezden gelin :))

Yanıtlar:


80

JSON verilerini yüklemeniz biraz kırılgan. Onun yerine:

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

gerçekten yapmalısın:

json_object = json.load(raw)

Elde ettiğiniz şeyi bir "JSON nesnesi" olarak düşünmemelisiniz. Sahip olduğun şey bir liste. Liste iki söz içerir. Dicts, tüm dizeleri olmak üzere çeşitli anahtar / değer çiftlerini içerir. Bunu yaptığınızda json_object[0], listedeki ilk dikteyi sorarsınız. İle bunun üzerinde for song in json_object[0]:yinelediğinizde, diktenin anahtarlarını yinelersiniz. Çünkü dikteyi yinelediğinizde elde ettiğiniz şey budur. Söz konusu diktede anahtarla ilişkili değere erişmek istiyorsanız, örneğin, kullanmalısınız json_object[0][song].

Bunların hiçbiri JSON'a özgü değil. Bu, herhangi bir öğreticide anlatılan temel işlemleriyle sadece temel Python türleridir.


anlamadım. Söylediklerinizin sınırların dışında söylediklerini yinelemeye çalıştım. Bunun json hakkında bir soru olduğundan oldukça eminim
myusuf3

7
Hayýr. Size söylüyorum, dikteyi yinelemek size anahtarlar verir. Başka bir şey üzerinde yinelemek istiyorsanız, başka bir şey üzerinde yinelemeniz gerekecek. Tekrarlamak istediğin şeyi söylemedin. Bir Python öğreticisi, neleri tekrarlayabileceğinizi ve ne yapacağını öğrenmek için iyi bir yer olacaktır.
Thomas Wouters

5
Maalesef, bir yoruma koyabileceğiniz 600 karakterlik listelerden, sözlüklerden ve dizelerden veri çıkarmanın tüm yollarını açıklamak biraz zor. Bir anahtarla ilişkili değere ulaşmak için dikteyi dizine eklemeniz gerektiğini zaten söylemiştim. Neyi tekrarlamak istediğinizden emin değilim. Yerleşik Python türleri hakkında bilgi edinmek sonraki adımdır.
Thomas Wouters

Tek tek öğeleri almak istediğinizde çok fazla yineleme yoktur. Belki de yinelemek istediğiniz şey json_objectdeğil json_object[0]ve sonra her bir dikteden ayrı öğeler elde etmektir .
Thomas Wouters

102

Muhtemelen şunu demek istediğine inanıyorum:

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

Not: Python 2'de if song.iteritemsyerine kullanabilirsiniz song.items.


öznitelik için song.iteritems () içindeki değer: bu satırdaki virgül neyi ifade ediyor?
zakdances

for (attribute, value) in song.iteritems():Veya (var1, var2) = (1, 2)veya ile aynıdır var1, var2 = 1, 2. çiftler (demetler) dict.iteritems()üretir (key, value). "Python tuple unpacking" arayın.
tzot

1
Piton 3 için, değiştirmek song.iteritemsiçin song.items.
Big Pumpkin

44

Bu soru uzun zamandır burada, ancak genellikle bir JSON nesnesi aracılığıyla nasıl yinelediğime katkıda bulunmak istedim. Aşağıdaki örnekte, JSON'u içeren sabit kodlu bir dize gösterdim, ancak JSON dizesi bir web hizmetinden veya bir dosyadan da aynı şekilde kolayca gelebilir.

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()

3
Yukarıdaki kodda herhangi bir dizge aboneliği yoktur; jsonObjectbir dict. Yukarıdaki kodda tercih ederim for key, value in jsonObject.items():.
tzot

22

JSON'un serisini kaldırdıktan sonra, bir python nesneniz var. Normal nesne yöntemlerini kullanın.

Bu durumda sözlüklerden oluşan bir listeniz olur:

json_object[0].items()

json_object[0]["title"]

vb.


8

Bu sorunu daha çok böyle çözerdim

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

3

JSON üzerinden yinelemek için şunu kullanabilirsiniz:

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'])

2

Python 3 için web sunucusundan geri aldığınız verilerin kodunu çözmeniz gerekir. Örneğin veriyi utf8 olarak çözerim ve sonra onunla ilgilenirim:

 # 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

Kod çözmezseniz, Python 3'te baytlara karşı dize hataları alırsınız.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.