【问题标题】:python convert one json structure to a nested structurepython将一个json结构转换为嵌套结构
【发布时间】:2017-03-21 12:39:54
【问题描述】:

如何将下面的json格式转换为下面的目标格式?我有 50,000 个条目。
基本上,从每个数组中获取唯一的国家,并在一个数组下包含具有相同国家名称的所有其他国家。

原始json:

[
    {
        "unilist": [
                {
                    "country": "United States",
                    "name": "The College of New Jersey",
                    "web_page": "http://www.tcnj.edu"
                },
                {
                    "country": "United States",
                    "name": "Abilene Christian University",
                    "web_page": "http://www.acu.edu/"
                },
                {
                    "country": "United States",
                    "name": "Adelphi University",
                    "web_page": "http://www.adelphi.edu/"
                },
                {
                    "country": "China",
                    "name": "Harbin Medical University",
                    "web_page": "http://www.hrbmu.edu.cn/"
                },
                {
                    "country": "China",
                    "name": "Harbin Normal University",
                    "web_page": "http://www.hrbnu.edu.cn/"
                }
                ...
                ]
    }
]

目标格式:

{
"unilist" : {
        "United States" : [
          {"name" : "The College of New Jersey", "web_page" : "http://www.tcnj.edu"},
          {"name" : "Abilene Christian University", "web_page" : "http://www.acu.edu/"},
          {"name" : "Adelphi University", "web_page" : "http://www.adelphi.edu/"}
        ],
        "China" : [
          {"name" : "Harbin Medical University", "web_page" : "http://www.hrbnu.edu.cn/"}
        ],
        ...
    }
}

更新

我的尝试(在 Python 2.7.11 中)基于 answer provided by downshift,但是它没有按预期工作,我收到以下 typeError:

from collections import defaultdict
import json
from pprint import pprint

with open('old_list.json') as orig_json:    
    newlist = defaultdict(list)

for country in orig_json[0]['unilist']:
    newlist[country['country']].append({'name': country['name'], 'web_page': country['web_page']})

with open('new_list.json', 'w') as fp:
            json.dump(newlist,fp)


pprint.pprint(dict(newlist))


类型错误:

Traceback (most recent call last):
  File "convert.py", line 8, in <module>
    for country in orig_json[0]['unilist']:
TypeError: 'file' object has no attribute '__getitem__'

【问题讨论】:

    标签: python json converter


    【解决方案1】:

    这会产生几乎相同的目标输出,只是缺少"unilist" 键。但至少它确实按国家/地区分组条目:

    import json
    from collections import defaultdict
    
    with open('original.json', 'r') as original:
        orig_json = original.read()[1:-1] # Remove outermost list brackets([]) to enable parsing data as JSON data, not a list
    
    oj = json.loads(orig_json)
    
    newlist = defaultdict(list)
    
    for country in oj['unilist']:
        newlist[country['country']].append({'name': country['name'], 
                                            'web_page': country['web_page']})
    
    with open('new.json', 'w') as outfile:
        json.dump(newlist, outfile)
    

    这会将newlist 保存到 json 文件“newlist.json”中

    输出:

    {'China': [{'name': 'Harbin Medical University',
                'web_page': 'http://www.hrbmu.edu.cn/'},
               {'name': 'Harbin Normal University',
                'web_page': 'http://www.hrbnu.edu.cn/'}],
     'United States': [{'name': 'The College of New Jersey',
                        'web_page': 'http://www.tcnj.edu'},
                       {'name': 'Abilene Christian University',
                        'web_page': 'http://www.acu.edu/'},
                       {'name': 'Adelphi University',
                        'web_page': 'http://www.adelphi.edu/'}]}
    

    如果我找到一种更好的方法来获得准确的目标输出,我会更新这个答案。同时,我希望这对您有所帮助。

    【讨论】:

    • 好的,谢谢,我要测试一下,让你知道结果是什么。
    • 如何打开定义我的文件条目,如何定义defaultdict?
    • 抱歉,我应该包含那个模块导入:from collections import defaultdict。添加到编辑
    • 对不起,我是一个新手,你能帮我定义我的文件并将其读入代码中,然后将其另存为另一个输出文件吗?
    • 我根据您的回答更新了我的问题,请您看看代码抛出的错误。为什么会这样?
    猜你喜欢
    • 2015-12-11
    • 2022-11-22
    • 1970-01-01
    • 1970-01-01
    • 2020-11-17
    • 2021-08-26
    • 2021-04-13
    • 2020-01-16
    • 1970-01-01
    相关资源
    最近更新 更多