Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

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

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'}]}
like image 823
Union find Avatar asked Apr 23 '14 21:04

Union find


2 Answers

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)
like image 69
eric chiang Avatar answered Sep 24 '22 06:09

eric chiang


"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()
like image 34
s16h Avatar answered Sep 23 '22 06:09

s16h