使用Python解析JSON文件时出现问题
我有一个相当大的JSON文件,它有一个文件夹、类和对象结构,我需要读取并将输出导出到dataframe。当我尝试我的逻辑,我能够得到第一个元素,但如果它有多个元素,我无法看到他们 我试着浏览了多个帖子,但到目前为止运气不好。谁能告诉我哪里出了问题,或者有没有更好的方法 我的示例JSON文件:使用Python解析JSON文件时出现问题,python,json,pandas,Python,Json,Pandas,我有一个相当大的JSON文件,它有一个文件夹、类和对象结构,我需要读取并将输出导出到dataframe。当我尝试我的逻辑,我能够得到第一个元素,但如果它有多个元素,我无法看到他们 我试着浏览了多个帖子,但到目前为止运气不好。谁能告诉我哪里出了问题,或者有没有更好的方法 我的示例JSON文件: { "root": { "id": 123456, "outline": { "folder": [ {
{
"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。正如回答中提到的,对于列表中的项目,[…]
只要有一个元素,就不必担心。即便如此,通过“尝试/抓住”策略,您应该处于安全位置。