从Json在Python中创建具有多个键值的嵌套Json结构

从Json在Python中创建具有多个键值的嵌套Json结构,python,json,python-3.x,d3.js,ipython,Python,Json,Python 3.x,D3.js,Ipython,我的代码如下: import json def reformat(importscompanies): #print importscompanies container={} child=[] item_dict={} for name, imports in importscompanies.iteritems(): item_dict['name'] = imports item_dict['size'] =

我的代码如下:

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)
我的问题是,代码没有贯穿整个文件。它只输出一个条目。为什么会这样?我是在重写什么东西吗?我是否需要另一个附在每个循环后面的dict

此外,for循环似乎正在通过每个dict键的iteritems。有没有办法让它只通过一次

事实上,这是一个非常重要的问题

 raw_data2 = raw_data[0]
我最终创建了一个迭代器来访问dict值

谢谢

最后,我希望我的最终Json文件是这样的,使用我上面提供的数据:

{'name': u'name', 'children': [{'name': u'500 Startups', 'size': '500'}, {'name': u'AffinityChina', 'size': '500'}]}
“它只输出一个条目”,因为当您说
raw_data2=raw_data[0]

尝试这样做作为起点(我还没有测试/运行它):


试试这个。虽然您的示例输入和输出数据并没有真正提供很多关于“name”字段应该来自何处的线索。我假设您想要列表中原始项目的名称

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)

我这样做是因为json.load是以列表的形式出现的,所以我认为它会转换为dict(它会这样做),同时保留所有数据。如何最好地避免这个问题?您是否可以编辑您的问题以准确显示您希望最终JSON的外观?使用您提供的示例列表中的前两个元素。
json.load
在本例中返回一个列表,因为您的文件包含一个附加项列表。当您说
raw_data 2=raw_data[0]
时,您的
raw_data 2
仅指向
raw_data
列表的第一个元素。它不会保留所有数据,只保留第一个元素。好吧,我怀疑这可能是个问题。你推荐一种修复方法吗?我在这里发布了这个问题,并得到了我使用的修复。两个问题。1) 您的
重新格式化功能返回了什么?2) 在您想要的JSON对象中,“大小”对应于什么?您是否可以编辑您的问题以准确显示您希望最终JSON的外观?请使用您提供的示例列表中的前2个元素。@s16h我已经添加了上面的示例。@ericchiang 1)重新格式化应该返回最后一个容器(可能我还需要一个用于追加?),换句话说,就是格式正确的Json。2) 大小没有对应的值,但是一个固定的数字。这需要循环使用更多的项目,所以这不起作用。“name”也是从原始对象派生的,因此它也需要循环。但是谢谢你,这很有帮助。@SamP。你所说的需要循环浏览更多项目是什么意思?循环将循环通过列表中的任意多个项目。我的意思是,您已经为父节点指定了名称“analytics”。这需要根据Json文件进行可变设置。所以它需要像我的代码一样循环。
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)