Creating nested Json structure with multiple key values in Python from Json
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()
Union find
Updated on April 25, 2020Comments
-
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 about 10 yearsI 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 about 10 yearsCould 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 about 10 years
json.load
returns a list in this case because your file has a list of ditionaries. When you sayraw_data2 = raw_data[0]
then you are havingraw_data2
point to only the first element of theraw_data
list. It wouldn't keep all the data, only the first element. -
Union find about 10 yearsOK 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 about 10 yearsThis 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 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 about 10 yearsI 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.