使用Python解析JSON文件时出现问题

使用Python解析JSON文件时出现问题,python,json,pandas,Python,Json,Pandas,我有一个相当大的JSON文件,它有一个文件夹、类和对象结构,我需要读取并将输出导出到dataframe。当我尝试我的逻辑,我能够得到第一个元素,但如果它有多个元素,我无法看到他们 我试着浏览了多个帖子,但到目前为止运气不好。谁能告诉我哪里出了问题,或者有没有更好的方法 我的示例JSON文件: { "root": { "id": 123456, "outline": { "folder": [ {

我有一个相当大的JSON文件,它有一个文件夹、类和对象结构,我需要读取并将输出导出到dataframe。当我尝试我的逻辑,我能够得到第一个元素,但如果它有多个元素,我无法看到他们

我试着浏览了多个帖子,但到目前为止运气不好。谁能告诉我哪里出了问题,或者有没有更好的方法

我的示例JSON文件:

{
    "root": {
        "id": 123456,
        "outline": {
            "folder": [
                {
                    "name": "First Folder",
                    "folder": [
                        {
                            "name": "First Class",
                            "item": [
                                {
                                    "@dataType": "String",
                                    "name": "ID1"
                                }
                            ]
                        },
                        {
                            "name": "Second Class",
                            "item": [
                                {
                                    "@dataType": "Numeric",
                                    "name": "FACTOR1"
                                }
                            ]
                        }
                    ]
                 },
                 {
                    "name": "Second Folder",
                    "folder": [
                        {
                            "name": "First Class",
                            "item": [
                                {
                                    "@dataType": "String",
                                    "name": "ID2"
                                }
                            ]
                        },
                        {
                            "name": "Second Class",
                            "item": [
                                {
                                    "@dataType": "Numeric",
                                    "name": "FACTOR2"
                                }
                            ]
                        }
                    ]
                }
            ]
        }
    }
}
['First Folder', 'First Class', 'ID1']
['First Folder', 'Second Class', 'FACTOR1']
['Second Folder', 'First Class', 'ID2']
['Second Folder', 'Second Class', 'FACTOR2']
import json

with open('Sample_File.json') as f_in:
    data = json.load(f_in)

for x in data['root']['outline']['folder']:
    print('Folder Name : {}'.format(x['name']))
    counter = 0
    for y in x['folder'][counter]['item']:
        print('Class Name : {}, Object Name : {}'.format(x['folder'][counter]['name'], y['name']))
    counter = counter + 1
['First Folder', 'First Class', 'ID1']
['Second Folder', 'First Class', 'ID2']
数据帧的预期输出:

{
    "root": {
        "id": 123456,
        "outline": {
            "folder": [
                {
                    "name": "First Folder",
                    "folder": [
                        {
                            "name": "First Class",
                            "item": [
                                {
                                    "@dataType": "String",
                                    "name": "ID1"
                                }
                            ]
                        },
                        {
                            "name": "Second Class",
                            "item": [
                                {
                                    "@dataType": "Numeric",
                                    "name": "FACTOR1"
                                }
                            ]
                        }
                    ]
                 },
                 {
                    "name": "Second Folder",
                    "folder": [
                        {
                            "name": "First Class",
                            "item": [
                                {
                                    "@dataType": "String",
                                    "name": "ID2"
                                }
                            ]
                        },
                        {
                            "name": "Second Class",
                            "item": [
                                {
                                    "@dataType": "Numeric",
                                    "name": "FACTOR2"
                                }
                            ]
                        }
                    ]
                }
            ]
        }
    }
}
['First Folder', 'First Class', 'ID1']
['First Folder', 'Second Class', 'FACTOR1']
['Second Folder', 'First Class', 'ID2']
['Second Folder', 'Second Class', 'FACTOR2']
import json

with open('Sample_File.json') as f_in:
    data = json.load(f_in)

for x in data['root']['outline']['folder']:
    print('Folder Name : {}'.format(x['name']))
    counter = 0
    for y in x['folder'][counter]['item']:
        print('Class Name : {}, Object Name : {}'.format(x['folder'][counter]['name'], y['name']))
    counter = counter + 1
['First Folder', 'First Class', 'ID1']
['Second Folder', 'First Class', 'ID2']
到目前为止我的python代码:

{
    "root": {
        "id": 123456,
        "outline": {
            "folder": [
                {
                    "name": "First Folder",
                    "folder": [
                        {
                            "name": "First Class",
                            "item": [
                                {
                                    "@dataType": "String",
                                    "name": "ID1"
                                }
                            ]
                        },
                        {
                            "name": "Second Class",
                            "item": [
                                {
                                    "@dataType": "Numeric",
                                    "name": "FACTOR1"
                                }
                            ]
                        }
                    ]
                 },
                 {
                    "name": "Second Folder",
                    "folder": [
                        {
                            "name": "First Class",
                            "item": [
                                {
                                    "@dataType": "String",
                                    "name": "ID2"
                                }
                            ]
                        },
                        {
                            "name": "Second Class",
                            "item": [
                                {
                                    "@dataType": "Numeric",
                                    "name": "FACTOR2"
                                }
                            ]
                        }
                    ]
                }
            ]
        }
    }
}
['First Folder', 'First Class', 'ID1']
['First Folder', 'Second Class', 'FACTOR1']
['Second Folder', 'First Class', 'ID2']
['Second Folder', 'Second Class', 'FACTOR2']
import json

with open('Sample_File.json') as f_in:
    data = json.load(f_in)

for x in data['root']['outline']['folder']:
    print('Folder Name : {}'.format(x['name']))
    counter = 0
    for y in x['folder'][counter]['item']:
        print('Class Name : {}, Object Name : {}'.format(x['folder'][counter]['name'], y['name']))
    counter = counter + 1
['First Folder', 'First Class', 'ID1']
['Second Folder', 'First Class', 'ID2']
我的当前输出不正确:

{
    "root": {
        "id": 123456,
        "outline": {
            "folder": [
                {
                    "name": "First Folder",
                    "folder": [
                        {
                            "name": "First Class",
                            "item": [
                                {
                                    "@dataType": "String",
                                    "name": "ID1"
                                }
                            ]
                        },
                        {
                            "name": "Second Class",
                            "item": [
                                {
                                    "@dataType": "Numeric",
                                    "name": "FACTOR1"
                                }
                            ]
                        }
                    ]
                 },
                 {
                    "name": "Second Folder",
                    "folder": [
                        {
                            "name": "First Class",
                            "item": [
                                {
                                    "@dataType": "String",
                                    "name": "ID2"
                                }
                            ]
                        },
                        {
                            "name": "Second Class",
                            "item": [
                                {
                                    "@dataType": "Numeric",
                                    "name": "FACTOR2"
                                }
                            ]
                        }
                    ]
                }
            ]
        }
    }
}
['First Folder', 'First Class', 'ID1']
['First Folder', 'Second Class', 'FACTOR1']
['Second Folder', 'First Class', 'ID2']
['Second Folder', 'Second Class', 'FACTOR2']
import json

with open('Sample_File.json') as f_in:
    data = json.load(f_in)

for x in data['root']['outline']['folder']:
    print('Folder Name : {}'.format(x['name']))
    counter = 0
    for y in x['folder'][counter]['item']:
        print('Class Name : {}, Object Name : {}'.format(x['folder'][counter]['name'], y['name']))
    counter = counter + 1
['First Folder', 'First Class', 'ID1']
['Second Folder', 'First Class', 'ID2']

这应该可以做到:

import json

with open('Sample_File.json') as f_in:
    data = json.load(f_in)

final_list = []

for x in data['root']['outline']['folder']:
  for y in x['folder']:
    for z in y['item']:
      final_list.append([x['name'],y['name'],z['name']])


for x in final_list:
  print(x)
输出:

['First Folder', 'First Class', 'ID1']
['First Folder', 'Second Class', 'FACTOR1']
['Second Folder', 'First Class', 'ID2']
['Second Folder', 'Second Class', 'FACTOR2']
['First Folder', 'First Class', 'ID1']
或者,如果您只想打印它们:

for x in data['root']['outline']['folder']:
  for y in x['folder']:
    for z in y['item']:
      print(x['name'],y['name'],z['name'])
稍后编辑(缺少关键点):

注意:对于列表中的元素(
[…]
),您不必担心。 但为了安全起见,让我们假设您使用如下json:

{"root": {
    "id": 123456,
    "outline": {
        "folder": [
            {
                "name": "First Folder",
                "folder": [
                    {
                        "name": "First Class",
                        "item": [
                            {
                                "@dataType": "String",
                                "name": "ID1"
                            }
                        ]
                    }
                ]
             },
             {
                "name": "Second Folder"
            }
        ]
    }
}
}
您将得到以下信息:
KeyError:“文件夹”

您可以使用我提到的try/except语句

try:
  for x in data['root']['outline']['folder']:
    for y in x['folder']:
      for z in y['item']:
        final_list.append([x['name'],y['name'],z['name']])
except KeyError:
  pass
输出:

['First Folder', 'First Class', 'ID1']
['First Folder', 'Second Class', 'FACTOR1']
['Second Folder', 'First Class', 'ID2']
['Second Folder', 'Second Class', 'FACTOR2']
['First Folder', 'First Class', 'ID1']

pass
表示如果触发了错误,就继续执行,就像什么都没发生一样,什么都不做(但可以替换为做某事,即“pass”)。

这应该可以做到:

import json

with open('Sample_File.json') as f_in:
    data = json.load(f_in)

final_list = []

for x in data['root']['outline']['folder']:
  for y in x['folder']:
    for z in y['item']:
      final_list.append([x['name'],y['name'],z['name']])


for x in final_list:
  print(x)
输出:

['First Folder', 'First Class', 'ID1']
['First Folder', 'Second Class', 'FACTOR1']
['Second Folder', 'First Class', 'ID2']
['Second Folder', 'Second Class', 'FACTOR2']
['First Folder', 'First Class', 'ID1']
或者,如果您只想打印它们:

for x in data['root']['outline']['folder']:
  for y in x['folder']:
    for z in y['item']:
      print(x['name'],y['name'],z['name'])
稍后编辑(缺少关键点):

注意:对于列表中的元素(
[…]
),您不必担心。 但为了安全起见,让我们假设您使用如下json:

{"root": {
    "id": 123456,
    "outline": {
        "folder": [
            {
                "name": "First Folder",
                "folder": [
                    {
                        "name": "First Class",
                        "item": [
                            {
                                "@dataType": "String",
                                "name": "ID1"
                            }
                        ]
                    }
                ]
             },
             {
                "name": "Second Folder"
            }
        ]
    }
}
}
您将得到以下信息:
KeyError:“文件夹”

您可以使用我提到的try/except语句

try:
  for x in data['root']['outline']['folder']:
    for y in x['folder']:
      for z in y['item']:
        final_list.append([x['name'],y['name'],z['name']])
except KeyError:
  pass
输出:

['First Folder', 'First Class', 'ID1']
['First Folder', 'Second Class', 'FACTOR1']
['Second Folder', 'First Class', 'ID2']
['Second Folder', 'Second Class', 'FACTOR2']
['First Folder', 'First Class', 'ID1']

pass
表示如果触发了错误,则继续执行,就像什么也没发生一样,什么也不做(但可以替换为做某事,即“pass”)。

在第一次迭代结束时,在
counter=counter+1
语句变量
counter
等于1之后。然后在打印函数之后的第二次迭代中,
计数器
再次变为0。所以你必须这样编码

import json

with open('Sample_File.json') as f_in:
    data = json.load(f_in)

for x in data['root']['outline']['folder']:
    print(f'Folder Name : {x["name"]}')
    for counter in range(len(x['folder'])):
        for y in x['folder'][counter]['item']:
            print(f'Class Name : {x["folder"][counter]["name"]}, Object Name : {y["name"]}')

在第一次迭代结束时,在
counter=counter+1
语句变量
counter
等于1之后。然后在打印函数之后的第二次迭代中,
计数器
再次变为0。所以你必须这样编码

import json

with open('Sample_File.json') as f_in:
    data = json.load(f_in)

for x in data['root']['outline']['folder']:
    print(f'Folder Name : {x["name"]}')
    for counter in range(len(x['folder'])):
        for y in x['folder'][counter]['item']:
            print(f'Class Name : {x["folder"][counter]["name"]}, Object Name : {y["name"]}')

谢谢@andreis11。但有一个问题——比如说,如果大型json文件中的一个元素丢失了,比如说,第二个“folder”元素丢失了,我们如何通过异常处理它?不客气。使用try/catch表达式捕获Keyvalue错误。将使用示例更新答案。@Prashanth添加了一些解释和变形的json。正如回答中提到的,对于列表中的项目,
[…]
只要有一个元素,就不必担心。即便如此,通过“尝试/抓住”策略,你应该处于安全的位置。谢谢@andreis11。但有一个问题——比如说,如果大型json文件中的一个元素丢失了,比如说,第二个“folder”元素丢失了,我们如何通过异常处理它?不客气。使用try/catch表达式捕获Keyvalue错误。将使用示例更新答案。@Prashanth添加了一些解释和变形的json。正如回答中提到的,对于列表中的项目,
[…]
只要有一个元素,就不必担心。即便如此,通过“尝试/抓住”策略,您应该处于安全位置。