【问题标题】:Creating nested Json structure with multiple key values in Python from Json从 Json 在 Python 中创建具有多个键值的嵌套 Json 结构
【发布时间】:2014-06-08 22:45:19
【问题描述】:

我的代码如下:

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 键的迭代项。有没有办法让它只通过一次?

问题确实是

 raw_data2 = raw_data[0]

我最终创建了一个迭代器来访问 dict 值。

谢谢。

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

{'name': u'name', 'children': [{'name': u'500 Startups', 'size': '500'}, {'name': u'AffinityChina', 'size': '500'}]}

【问题讨论】:

  • 两个问题。 1) 你从reformat 函数返回什么? 2) 在你想要的 JSON 对象中,'size' 对应什么?
  • 您能否编辑您的问题以准确显示您希望最终 JSON 的样子?可能使用您提供的示例列表中的前 2 个元素。
  • @s16h 我已经添加了上面的示例。
  • @ericchiang 1) 重新格式化应该返回最终的容器(也许我还需要一个附加的容器?)换句话说,正确格式化的 Json。 2) size 没有对应的值,是一个集合的数字。

标签: python json python-3.x d3.js ipython


【解决方案1】:

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

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)

【讨论】:

  • 这需要循环更多的项目,这样就行不通了。 “名称”也是从原始对象派生的,因此也需要循环。但是谢谢你,这很有帮助。
  • @SamP。你是什​​么意思需要循环通过更多的项目?循环将遍历列表中的所有项目
  • 我的意思是,您已为父节点分配了名称“分析”。这需要根据 Json 文件进行可变设置。所以它需要像我的代码一样循环。
【解决方案2】:

“它只输出一个条目”,因为当你说raw_data2 = raw_data[0]时,你只选择了JSON文件中的第一个字典

尝试这样的事情作为起点(我还没有测试/运行过):

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()

【讨论】:

  • 我这样做是因为 json.load 是以列表的形式出现的,所以我认为它会在保留所有数据的同时转换为 dict(它确实如此)。如何最好地规避这个问题?
  • 您能否编辑您的问题以准确显示您希望最终 JSON 的样子?可能使用您提供的示例列表中的前 2 个元素。
  • json.load 在这种情况下返回一个列表,因为您的文件有一个字典列表。当您说raw_data2 = raw_data[0] 时,您让raw_data2 仅指向raw_data 列表的第一个元素。它不会保留所有数据,只保留第一个元素。
  • 好的,我怀疑这可能是个问题。你建议修复吗?我在这里发布了这个问题,我得到了我使用的修复程序。 stackoverflow.com/questions/23230669/…
猜你喜欢
  • 1970-01-01
  • 2022-01-02
  • 2016-08-19
  • 2014-11-24
  • 2022-11-24
  • 2017-12-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多