遍历一个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
此代码仅在以下情况下打印信息:
。 ( 忽略贾斯汀·比伯曲目 :))
您加载的JSON数据有点脆弱。 代替:
json_raw= raw.readlines() json_object = json.loads(json_raw[0])
你应该真的这样做:
json_object = json.load(raw)
你不应该想到你作为一个“JSON对象”。 你有什么是一个列表。 该列表包含两个字母。 字典包含各种键/值对,所有string。 当你做json_object[0]
,你要求列表中的第一个字典。 当你遍历这个, for song in json_object[0]:
,你迭代字典的键。 因为这是你迭代字典时得到的。 如果要访问与该字典中的键相关的值,可以使用例如json_object[0][song]
。
这些都不是特定于JSON。 这只是基本的Pythontypes,其基本操作在任何教程中都有介绍。
我相信你的意思可能是:
for song in json_object: # now song is a dictionary for attribute, value in song.iteritems(): print attribute, value # example usage
反序列化JSON之后,你有一个python对象。 使用常规的对象方法。
在这种情况下,你有一个由词典组成的列表:
json_object[0].items() json_object[0]["title"]
等等
这个问题已经在这里很长一段时间了,但我想贡献我通常如何迭代通过JSON对象。 在下面的示例中,我展示了一个包含JSON的硬编码string,但JSONstring可以很容易地来自Web服务或文件。
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()
我会更像这样解决这个问题
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,您必须解码从Web服务器获取的数据。 例如,我将数据解码为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中的字节与string错误。