views:

326

answers:

4
        [
    {
        "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
    }
]

That is the current JSON object I have.

I am now trying to iterate through it to get the import stuff like title and link.

This is where I am having trouble I cant seem to get to the content that is past the ":" i tried doing dictionary way couldn't get it.

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

This code prints all the information before ":"

Please help. ignore the Justin Bieber track :)

+3  A: 

Your loading of the JSON data is a little fragile. Instead of:

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

you should really just do:

json_object = json.load(raw)

You shouldn't think of what you get as a "JSON object". What you have is a list. The list contains two dicts. The dicts contain various key/value pairs, all strings. When you do json_object[0], you're asking for the first dict in the list. When you iterate over that, with for song in json_object[0]:, you iterate over the keys of the dict. Because that's what you get when you iterate over the dict. If you want to access the value associated with the key in that dict, you would use, for example, json_object[0][song].

None of this is specific to JSON. It's just basic Python types, with their basic operations as covered in any tutorial.

Thomas Wouters
i don't get it. i tried to iterate through what your saying says out of bounds. i am pretty sure its a question about json
garbagecollector
No. I'm telling you that iterating over the dict gives you the keys. If you want to iterate over something else, you'll have to iterate over something else. You didn't say what you wanted to iterate over. A Python tutorial would be a good place to find out what you can iterate over, and what it would do.
Thomas Wouters
Does json.load work on App Engine? I'm using simplejson.
Jorge
no need to be condescending Thomas. :)
garbagecollector
i am using simplejson as well. I just imported it as json Jorge
garbagecollector
Unfortunately it's a little hard to explain all the ways you can extract data from lists and dictionaries and strings in the 600 characters you can put in a comment. I already said you should index the dict to get at the value associated with a key. I'm not sure what you want to iterate over. Learning about built-in Python types is the next step.
Thomas Wouters
thanks the modification on the raw stuff is better :)
garbagecollector
I did say what i wanted to iterate over, title, link, and description. :)
garbagecollector
There's not much iteration involved when you want to get individual items. Perhaps what you want to iterate over is `json_object`, not `json_object[0]`, and then get individual items from each dict.
Thomas Wouters
+1  A: 

After deserializing the JSON, you have a python object. Use the regular object methods.

In this case you have a list made of dictionaries:

json_object[0].items()

json_object[0]["title"]

etc.

jcea
thanks for the help it worked! :)
garbagecollector
A: 

I would solve this problem more like this

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
A: 

I believe you probably meant:

for song in json_object:
    # now song is a dictionary
    for attribute, value in song.iteritems():
        print attribute, value # example usage
ΤΖΩΤΖΙΟΥ