Creating nested Json structure with multiple key values in Python from Json

30,933

Solution 1

Try this. Though your sample input and output data don't really give many clues as to where the "name" fields should come from. I've assumed you wanted the name of the original item in your list.

original_json = json.load(open('data/bricsinvestorsfirst.json'),'r')

response_json = {}
response_json["name"] = "analytics"

# where your children list will go
children = []

size = 500 # or whatever else you want

# For each item in your original list
for item in original_json:
    children.append({"name" : item["name"],
                     "size" : size})

response_json["children"] = children

print json.dumps(response_json,indent=2)

Solution 2

"It's only outputting one entry" because you only select the first dictionary in the JSON file when you say raw_data2 = raw_data[0]

Try something like this as a starting point (I haven't tested/ran it):

import json

def run():
    with open('data/bricsinvestorsfirst.json') as input_file:
        raw_data = json.load(input_file)

    children = []
    for item in raw_data:
        children.append({
            'name': item['name'],
            'size': '500'
        })

    container = {}
    container['name'] = 'name'
    container['children'] = children

    return json.dumps(container)

if __name__ == '__main__':
    print run()
Share:
30,933
Union find
Author by

Union find

Updated on April 25, 2020

Comments

  • Union find
    Union find about 4 years

    My code is as follows:

    import json
    
    def reformat(importscompanies): 
        #print importscompanies
    
        container={}
        child=[]
        item_dict={}
    
        for name, imports in importscompanies.iteritems():
            item_dict['name'] = imports
            item_dict['size'] = '500'
    
            child.append(dict(item_dict))
            container['name'] = name
            container['children'] = child
    
    if __name__ == '__main__':
        raw_data = json.load(open('data/bricsinvestorsfirst.json'))
        run(raw_data)
    
    def run(raw_data):
        raw_data2 = raw_data[0]
        the_output = reformat(raw_data2)
    

    My issue is, the code isn't going through the whole file. It's only outputting one entry. Why is this? Am I rewriting something and do I need another dict that appends with every loop?

    Also, it seems as though the for loop is going through the iteritems for each dict key. Is there a way to make it pass only once?

    The issue is indeed

     raw_data2 = raw_data[0]
    

    I ended up creating an iterator to access the dict values.

    Thanks.

    Lastly, I'm hoping my final Json file looks this way, using the data I provided above:

    {'name': u'name', 'children': [{'name': u'500 Startups', 'size': '500'}, {'name': u'AffinityChina', 'size': '500'}]}
    
  • Union find
    Union find about 10 years
    I did that because the json.load is coming in as a list, so I thought that would convert to a dict (which it does) while keeping all the data. How is best to circumvent this issue?
  • s16h
    s16h about 10 years
    Could you edit your question to show exactly how you want your final JSON look like? Use the first 2 elements in the sample list you have provided perhaps.
  • s16h
    s16h about 10 years
    json.load returns a list in this case because your file has a list of ditionaries. When you say raw_data2 = raw_data[0] then you are having raw_data2 point to only the first element of the raw_data list. It wouldn't keep all the data, only the first element.
  • Union find
    Union find about 10 years
    OK I suspected that might be an issue. Do you recommend a fix? I posted the issue here and I got the fix I used. stackoverflow.com/questions/23230669/…
  • Union find
    Union find about 10 years
    This needs to loop through a lot more items, so that won't work. Also "name" is derived from an original object and so it also needs to be looped. But thank you that is helpful.
  • eric chiang
    eric chiang about 10 years
    @SamP. What do you mean by needs to loop through a lot more items? A loop will loop through as many items as your list has
  • Union find
    Union find about 10 years
    I mean, you've assigned the parent node the name "analytics". That needs to be set variably based on the Json file. So it needs to be looped as my code does.