Итерации через JSON-объект
Я пытаюсь выполнить итерации через объект JSON для импорта данных, т. е. название и ссылка. Кажется, я не могу добраться до содержимого, которое прошло :
.
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
}
]
Я пробовал использовать словарь:
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
этот код только выводит информацию перед :
.
(игнорировать трек Джастина Бибера :))
7 ответов:
ваша загрузка данных JSON немного хрупкая. Вместо:
json_raw= raw.readlines() json_object = json.loads(json_raw[0])
вы действительно должны просто сделать:
json_object = json.load(raw)
вы не должны думать о том, что вы получаете как "объект JSON". Что у вас есть список. Список содержит два диктанта. Дикты содержат различные пары ключ / значение, все строки. Когда вы делаете
json_object[0]
, вы просите первый дикт в списке. Когда вы повторяете это, сfor song in json_object[0]:
, вы перебираете клавиши диктатора. Потому что это то, что вы получаете когда вы повторяете над дикт. Если вы хотите получить доступ к значению, связанному с ключом в этом dict, вы должны использовать, например,json_object[0][song]
.ничего из этого не относится к JSON. Это просто основные типы Python, с их основными операциями, как описано в любом учебнике.
Я верю, ты наверное имел ввиду:
for song in json_object: # now song is a dictionary for attribute, value in song.iteritems(): print attribute, value # example usage
NB: используйте
song.items
вместоsong.iteritems
для Python 3.
этот вопрос был здесь долгое время, но я хотел внести свой вклад в то, как я обычно перебираю объект JSON. В приведенном ниже примере я показал жестко закодированную строку, содержащую JSON, но строка JSON могла так же легко прийти из веб-службы или файла.
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()
после десериализации JSON у вас есть объект python. Используйте обычные методы объекта.
в этом случае у вас есть список словарей:
json_object[0].items() json_object[0]["title"]
etc.
Я бы решил эту проблему больше так
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
для Python 3, Вы должны декодировать данные от веб-сервера. Например, я декодирую данные как utf8, а затем занимаюсь этим:
# 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
Если вы не декодируете, вы получите байты против строковых ошибок в Python 3.