迭代JSON对象

myu*_*uf3 92 python dictionary loops

我试图迭代一个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
    }
]
Run Code Online (Sandbox Code Playgroud)

我尝试使用字典:

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
Run Code Online (Sandbox Code Playgroud)

此代码仅在之前打印信息:.(忽略贾斯汀比伯赛道 :))

tzo*_*zot 88

我相信你可能意味着:

for song in json_object:
    # now song is a dictionary
    for attribute, value in song.iteritems():
        print attribute, value # example usage
Run Code Online (Sandbox Code Playgroud)

注意:使用song.items而不是song.iteritemsPython 3.

  • 对于 python 3,将 `song.iteritems` 更改为 `song.items`。 (2认同)

Tho*_*ers 72

您加载JSON数据有点脆弱.代替:

json_raw= raw.readlines()
json_object = json.loads(json_raw[0])
Run Code Online (Sandbox Code Playgroud)

你应该真的这样做:

json_object = json.load(raw)
Run Code Online (Sandbox Code Playgroud)

你不应该想到你得到的"JSON对象".你有一个清单.该清单包含两个词组.dicts包含各种键/值对,所有字符串.当你这样做时json_object[0],你要求列表中的第一个字典.当你迭代它时for song in json_object[0]:,你会迭代dict的键.因为这是你在迭代dict时得到的.如果要访问与该dict中的键关联的值,则可以使用,例如,json_object[0][song].

这些都不是特定于JSON的.它只是基本的Python类型,其基本操作在任何教程中都有介绍.

  • 不,我告诉你,迭代dict会给你钥匙.如果你想迭代其他东西,你将不得不迭代其他东西.你没有说出你想要迭代的东西.Python教程将是一个很好的地方,可以找出你可以迭代的东西,以及它会做什么. (7认同)
  • 不幸的是,解释所有可以从列表和字典以及字符串中提取数据的方法有点难以解释.我已经说过你应该索引dict以获得与密钥相关的值.我不确定你想要迭代什么.下一步是学习内置Python类型. (5认同)

Dal*_*ore 36

这个问题已经存在很长时间了,但我想贡献一下我通常迭代JSON对象的方式.在下面的示例中,我展示了一个包含JSON的硬编码字符串,但JSON字符串可以很容易地来自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()
Run Code Online (Sandbox Code Playgroud)

  • 上面的代码中没有字符串下标;jsonObject是字典。在上面的代码中,我希望使用jsonObject.items()中的key作为value。 (2认同)

jce*_*cea 20

反序列化JSON后,你有一个python对象.使用常规对象方法.

在这种情况下,您有一个由字典组成的列表:

json_object[0].items()

json_object[0]["title"]
Run Code Online (Sandbox Code Playgroud)

等等


Mik*_*ham 8

我会更像这样解决这个问题

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
Run Code Online (Sandbox Code Playgroud)


jam*_*ell 5

对于 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

Run Code Online (Sandbox Code Playgroud)

如果不解码,Python 3 中将出现字节与字符串错误。