Reading a Json response recursively with python

£可爱£侵袭症+ 提交于 2021-01-28 05:30:25

问题


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:

This is the Json response that I'm trying to read:

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

This is the funcion that I'm using:

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

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.

 Traceback (most recent call last):
      File "main.py", line 135, in <module>
        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'

My problem is that in some point the json that should be printed looks like this, without the '[ ]':

{"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"}

When the function tries to find the 'key,value' from this json, I got this error:

 Traceback (most recent call last): File "main.py", line 135, in <module>
    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)

What should I do in this case? Or any other way to get the same result?


回答1:


Use that:

def format_main_response(json_string):
    print "json:       " + json_string
    content = json.loads(str(json_string))
    for key, value in content.iteritems():
        print key
        if type(value) == type(['']):
            for sub_value in value:
                strg = str(json.dumps(sub_value))
                format_main_response(strg)
        else:
            print value

That's the result:

~$ python test_pdb.py 
json:       {"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"}]}
servers
json:       {"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"}
id
a059eccb-d929-43b2-8db3-b32b6201d60f
links
json:       {"href": "http://192.168.100.142:8774/v2/2ad1fc162c254e59bea043560b7f73cb/servers/a059eccb-d929-43b2-8db3-b32b6201d60f", "rel": "self"}
href
http://192.168.100.142:8774/v2/2ad1fc162c254e59bea043560b7f73cb/servers/a059eccb-d929-43b2-8db3-b32b6201d60f
rel
self
json:       {"href": "http://192.168.100.142:8774/2ad1fc162c254e59bea043560b7f73cb/servers/a059eccb-d929-43b2-8db3-b32b6201d60f", "rel": "bookmark"}
href
http://192.168.100.142:8774/2ad1fc162c254e59bea043560b7f73cb/servers/a059eccb-d929-43b2-8db3-b32b6201d60f
rel
bookmark
name
birk



回答2:


How about:

jsonStr = {"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"}
print json.dumps(jsonStr, sort_keys=True, indent=2, separators=(',', ': '))

This should give you the format you want




回答3:


Code below recursively traverses the json response and prints the key,value pairs: Trick is to load json response only once in the main and then recursively traverse the response:

def parse_json_response(content):

    if len (content.keys()) > 1 :
        for key, value in content.iteritems():
           print "key : ", key
           print "Value", value

            if type(value) is dict:
                parse_json_response(value)
    else:
        print value

if __name__ == '__main__':

    content = json.loads(str(response))
    parse_json_response(content)

Hope it helps.



来源:https://stackoverflow.com/questions/10540712/reading-a-json-response-recursively-with-python

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!