AAA
AAA

Reputation: 2032

Iterating and printing JSON objects in Python

I have a Google Spreadsheet that I'd like to get in Python, then process it through JSON. It's halfway working, and after looking through Stackoverflow for several hours, I think it's time to ask a question.

For example, the format of the JSON file looks like this (from https://developers.google.com/gdata/docs/json).

{
  "version": "1.0",
  "encoding": "UTF-8",
  "feed": {
    "xmlns": "http://www.w3.org/2005/Atom",
    "xmlns$openSearch": "http://a9.com/-/spec/opensearchrss/1.0/",
    "xmlns$gd": "http://schemas.google.com/g/2005",
    "xmlns$gCal": "http://schemas.google.com/gCal/2005",
    "id": {"$t": "..."},
    "updated": {"$t": "2006-11-12T21:25:30.000Z"},
    "title": {
      "type": "text",
      "$t": "Google Developer Events"
    },
    "subtitle": {
      "type": "text",
      "$t": "The calendar contains information about upcoming developer 
       conferences at which Google will be speaking, along with other 
       developer-related events."
    },
    "link": [{
      "rel": "...",
      "type": "application/atom+xml",
      "href": "..."
      },{
      "rel": "self",
      "type": "application/atom+xml",
      "href": "..."
    }],
    "author": [{
      "name": {"$t": "Google Developer Calendar"},
      "email": {"$t": "[email protected]"}
    }],
    "generator":{
      "version": "1.0",
      "uri": "http://www.google.com/calendar",
      "$t": "Google Calendar"
    },
    "openSearch$startIndex": {"$t": "1"},
    "openSearch$itemsPerPage": {"$t": "25"},
    "gCal$timezone": {"value": "America/Los_Angeles"},

    "entry": [{
      "id": {"$t": "..."},
      "published": {"$t": "2006-11-12T21:25:30.000Z"},
      "updated": {"$t": "2006-11-12T21:25:30.000Z"},
      "category": [{
        "scheme": "...",
        "term": "..."
      }],
      "title":{
        "type": "text",
        "$t": "WebmasterWorld PubCon 2006: Google Developer Tools in General"
      },
      "content": {
        "type": "text",
        "$t": "Google is sponsoring at
          <a href=\"http://www.pubcon.com/\">WebmasterWorld PubCon 2006</a>.
          \n Come and visit us at the booth or join us for an evening demo
          reception where we will be talking \"5 ways to enhance your website
          with Google Code\". \n After all, \n it is Vegas, baby! See you soon."
      },
      "link": [{
        "rel": "alternate",
        "type": "text/html",
        "href": "...",
        "title": "alternate"
        },{
        "rel": "self",
        "type": "application/atom+xml",
        "href": "..."
      }],
      "author": [{
        "name": {"$t": "Google Developer Calendar"},
        "email": {"$t": "[email protected]"}
      }],
      "gd$transparency": {"value": "http://schemas.google.com/g/2005#event.opaque"},
      "gd$eventStatus": {"value": "http://schemas.google.com/g/2005#event.confirmed"},
      "gd$comments": {"gd$feedLink": {"href": "..."}},
      "gCal$sendEventNotifications": {"value": "true"},
      "gd$when": [{
        "startTime": "2006-11-15",
        "endTime": "2006-11-17",
        "gd$reminder": [{"minutes": "10"}]
      }],
      "gd$where": [{"valueString": "3150 Paradise Road,Las Vegas,NV 89109"}]},
    }]
  }
}

My Python code is as follows:

import requests, json
r = requests.get('link-to-google-spreadsheet-json')
j = r.json()

Testing the top-level hierarchy of the JSON file outputs as follows:

>>> print j["version"]
1.0

But iterating over the objects, like so:

for feed in j["feed"]:
    for entry in feed["entry"]:
        for title in entry["title"]:
            print title["$t"]
        print
    print

Gives me the following error:

Traceback (most recent call last):
File "<console>", line 2, in <module>
TypeError: string indices must be integers.

It sounds like it wants to print a single letter from the string, provided I give the index number. So how do I parse the JSON so that it correctly outputs what I want (e.g. feed -> entry -> title -> $t)?

Upvotes: 3

Views: 29983

Answers (2)

Lycha
Lycha

Reputation: 10187

feed and title are dictionaries not lists so you should not have for-loop over them. You only need one for-loop that is for the entry-list.

Upvotes: 0

sneawo
sneawo

Reputation: 3631

j['feed'] is a dictionary. Your code should look like:

for entry in j['feed']['entry']:
    print entry['title']['$t']

Upvotes: 9

Related Questions