Recursive function to create hierarchical JSON object?

后端 未结 5 1973
庸人自扰
庸人自扰 2021-02-08 19:08

I\'m just not a good enough computer scientist to figure this out by myself :(

I have an API that returns JSON responses that look like this:

// call to         


        
相关标签:
5条回答
  • 2021-02-08 19:25

    Disclaimer : I have no idea what json is about, so you may have to sort out how to write it correctly in your language :p. If the pseudo-code in my example is too pseudo, feel free to ask more details.

    You need to return something somewhere. If you never return something in your recursive call, you can't get the reference to your new objects and store it in the objects you have where you called the recursion.

    def getChildNodes (node) returns [array of childNodes]
        data = getData(fromServer(forThisNode))
        new childNodes array
        for child in data :
            new temp_obj
            temp_obj.stores(child.interestingStuff)
            for grandchild in getChildNodes(child) :
                temp_obj.arrayOfchildren.append(grandchild) 
            array.append(temp_obj)
        return array
    

    Alternatively, you can use an iterator instead of a return, if your language supports it.

    0 讨论(0)
  • 2021-02-08 19:29

    You could use this (a more compact and readable version)

    def get_child_nodes(node_id):   
        request = urllib2.Request(ROOT_URL + node_id)
        response = json.loads(urllib2.urlopen(request).read())
        return {
           "id":response['id'],
           "name":response['name'],
           "children":map(lambda childId: get_child_nodes(childId), response['childNode'])
        }
    
    get_child_nodes(ROOT_NODE)
    
    0 讨论(0)
  • 2021-02-08 19:32
    def get_node(node_id):   
        request = urllib2.Request(ROOT_URL + node_id)
        response = json.loads(urllib2.urlopen(request).read())
        temp_obj = {}
        temp_obj['id'] = response['id']
        temp_obj['name'] = response['name']
        temp_obj['children'] = [get_node(child['id']) for child in response['childNode']]
        return temp_obj
    
    hierarchy = get_node(ROOT_NODE)
    
    0 讨论(0)
  • You're not returning anything from each call to the recursive function. So, it seems like you just want to append each temp_obj dictionary into a list on each iteration of the loop, and return it after the end of the loop. Something like:

    def get_child_nodes(node_id):   
        request = urllib2.Request(ROOT_URL + node_id)
        response = json.loads(urllib2.urlopen(request).read())
        nodes = []
        for childnode in response['childNode']:
            temp_obj = {}
            temp_obj['id'] = childnode['id']
            temp_obj['name'] = childnode['name']
            temp_obj['children'] = get_child_nodes(temp_obj['id'])
            nodes.append(temp_obj)
        return nodes
    
    my_json_obj = json.dumps(get_child_nodes(ROOT_ID))
    

    (BTW, please beware of mixing tabs and spaces as Python isn't very forgiving of that. Best to stick to just spaces.)

    0 讨论(0)
  • 2021-02-08 19:46

    I had the same problem this afternoon, and ended up rejigging some code I found online.

    I've uploaded the code to Github (https://github.com/abmohan/objectjson) as well as PyPi (https://pypi.python.org/pypi/objectjson/0.1) under the package name 'objectjson'. Here it is below, as well:

    Code (objectjson.py)

    import json
    
    class ObjectJSON:
    
      def __init__(self, json_data):
    
        self.json_data = ""
    
        if isinstance(json_data, str):
          json_data = json.loads(json_data)
          self.json_data = json_data
    
        elif isinstance(json_data, dict):
          self.json_data = json_data
    
      def __getattr__(self, key):
        if key in self.json_data:
          if isinstance(self.json_data[key], (list, dict)):
            return ObjectJSON(self.json_data[key])
          else:
            return self.json_data[key]
        else:
          raise Exception('There is no json_data[\'{key}\'].'.format(key=key))
    
      def __repr__(self):
        out = self.__dict__
        return '%r' % (out['json_data'])
    

    Sample Usage

    from objectjson import ObjectJSON
    
    json_str = '{ "test": {"a":1,"b": {"c":3} } }'
    
    json_obj = ObjectJSON(json_str)
    
    print(json_obj)           # {'test': {'b': {'c': 3}, 'a': 1}}
    print(json_obj.test)      # {'b': {'c': 3}, 'a': 1}
    print(json_obj.test.a)    # 1
    print(json_obj.test.b.c)  # 3
    
    0 讨论(0)
提交回复
热议问题