title: Reading a Json response recursively with python
body: <p>I'm trying to print all the "keys, values" from a json response without knowing the keys names (without using the syntax json['example'], for example). I'm doing this with a recursively function that uses iteritems(), but I'm having some problems:</p>
  
  <p>This is the Json response that I'm trying to read:</p>
  
  <pre><code>{"servers": [{"id": "a059eccb-d929-43b2-8db3-b32b6201d60f", "links": [{"href": "http://192.168.100.142:8774/v2/2ad1fc162c254e59bea043560b7f73cb/servers/a059eccb-d929-43b2-8db3-b32b6201d60f", "rel": "self"}, {"href": "http://192.168.100.142:8774/2ad1fc162c254e59bea043560b7f73cb/servers/a059eccb-d929-43b2-8db3-b32b6201d60f", "rel": "bookmark"}], "name": "birk"}]}
  </code></pre>
  
  <p>This is the funcion that I'm using:</p>
  
  <pre><code>def format_main_response(self, json_string):
      print "json:       " + json_string
      content = json.loads(str(json_string))
      for key, value in content.iteritems():
          print key
          if type(value) == type(['']):
              strg = str(json.dumps(value))
              strg = strg.strip('[]')
              self.format_main_response(strg)
          else:
              print value
  </code></pre>
  
  <p>I'm using the strip function to take out all the '[ ]' from my json string. If I didn't do that I got an error when trying to load it using 'json.loads()' function.</p>
  
  <pre><code> Traceback (most recent call last):
        File "main.py", line 135, in &lt;module&gt;
          formatter.format_main_response(nova_API.list_servers())
        File "/home/python/jsonformatter.py", line 51, in format_main_response
          self.format_main_response(strg, mod)
        File "/home/python/jsonformatter.py", line 51, in format_main_response
          self.format_main_response(strg, mod)
        File "/home/python/jsonformatter.py", line 31, in format_main_response
          for key, value in content.iteritems():
      AttributeError: 'list' object has no attribute 'iteritems'
  </code></pre>
  
  <p>My problem is that in some point the json that should be printed looks like this, without the '[ ]':</p>
  
  <pre><code>{"href": "http://192.168.100.142:8774/v2/2ad1fc162c254e59bea043560b7f73cb/servers/a059eccb-d929-43b2-8db3-b32b6201d60f", "rel": "self"}, {"href": "http://192.168.100.142:8774/2ad1fc162c254e59bea043560b7f73cb/servers/a059eccb-d929-43b2-8db3-b32b6201d60f", "rel": "bookmark"}
  </code></pre>
  
  <p>When the function tries to find the 'key,value' from this json, I got this error:   </p>
  
  <pre><code> Traceback (most recent call last): File "main.py", line 135, in &lt;module&gt;
      formatter.format_main_response(nova_API.list_servers())
    File "/home/python/jsonformatter.py", line 34, in format_main_response
      self.format_main_response(strg)
    File "/home/python/jsonformatter.py", line 34, in format_main_response
      self.format_main_response(strg)
    File "/home/python/jsonformatter.py", line 28, in format_main_response
      content = json.loads(str(json_string))
    File "/usr/lib/python2.7/json/__init__.py", line 326, in loads
      return _default_decoder.decode(s)
    File "/usr/lib/python2.7/json/decoder.py", line 369, in decode
      raise ValueError(errmsg("Extra data", s, end, len(s)))
  ValueError: Extra data: line 1 column 135 - line 1 column 273 (char 135 - 273)
  </code></pre>
  
  <p>What should I do in this case? Or any other way to get the same result?</p>