我有下面的 4 级嵌套 JSON 文件,我想将其规范化为一级嵌套:
输入文件是这样的:
{
"@index": "40",
"row": [
{
"column": [
{
"text": {
"@fontName": "Times New Roman",
"@fontSize": "12.0",
"@x": "85.10",
"@y": "663.12",
"@width": "250.01",
"@height": "12.00",
"#text": "text 1"
}
}
]
},
{
"column": [
{
"text": {
"@fontName": "Times New Roman",
"@fontSize": "8.0",
"@x": "121.10",
"@y": "675.36",
"@width": "348.98",
"@height": "8.04",
"#text": "text 2"
}
},
{
"text": {
"@fontName": "Times New Roman",
"@fontSize": "12.0",
"@x": "473.30",
"@y": "676.92",
"@width": "42.47",
"@height": "12.00",
"#text": "text 3"
}
}
]
},
{
"column": [
{
"text": {
"@fontName": "Times New Roman",
"@fontSize": "12.0",
"@x": "85.10",
"@y": "690.72",
"@width": "433.61",
"@height": "12.00",
"#text": "text 4"
}
}
]
}
]
}
期望的输出是这样的:
{
"@index": "40",
"row": [
{
"@fontName": "Times New Roman",
"@fontSize": "12.0",
"@x": "85.10",
"@y": "663.12",
"@width": "250.01",
"@height": "12.00",
"#text": "Text 1"
},
{
"@fontName": "Times New Roman",
"@fontSize": "8.0",
"@x": "121.10",
"@y": "675.36",
"@width": "348.98",
"@height": "8.04",
"#text": "Text 2"
},
{
"@fontName": "Times New Roman",
"@fontSize": "12.0",
"@x": "473.30",
"@y": "676.92",
"@width": "42.47",
"@height": "12.00",
"#text": "Text 3"
},
{
"@fontName": "Times New Roman",
"@fontSize": "12.0",
"@x": "85.10",
"@y": "690.72",
"@width": "433.61",
"@height": "12.00",
"#text": "Text 4"
}
]
}
我目前拥有的代码是使用 pandas 的代码如下,但我不知道如何继续规范化到一个级别。
import json
import pandas as pd
from pandas.io.json import json_normalize #package for flattening json in pandas df
#load json object
with open('D:\Files\JSON\4Level.json') as f:
d = json.load(f)
nycphil = json_normalize(d['row'])
print (nycphil.head(4))
这是当前输出列表,其中显示 column 是一个嵌套元素:
column
0 [{'text': {'@fontName': 'Times New Roman', '@f...
1 [{'text': {'@fontName': 'Times New Roman', '@f...
2 [{'text': {'@fontName': 'Times New Roman', '@f...
具有一层嵌套的打印将是:
text.#text text.@fontName text.@fontSize ... text.@width text.@x text.@y
0 Text 1 Times New Roman 12.0 ... 250.01 85.10 663.12
1 Text 2 Times New Roman 8.0 ... 348.98 121.10 675.36
2 Text 3 Times New Roman 12.0 ... 42.47 473.30 676.92
3 Text 4 Times New Roman 12.0 ... 433.61 85.10 690.72
Input/Output 比较是这样的:
也许有人可以帮我解决这个问题。感谢您的帮助。
更新
为了在我展示的第一个示例输入中制作一个小示例,我删除了一些您的脚本中似乎需要的元素才能正常工作。所以现在我展示了与真实文件完全相同的结构,但是有了这个输入,你的脚本就不起作用了。我认为它们需要稍微调整一下,但我一直在尝试,但我不知道如何更改它们以获得与此新输入相同的输出。也许你可以帮助我,很抱歉没有从一开始就显示正确的输入。
{
"document":{
"page":[
{
"@index":"0",
"image":{
"@data":"ABC",
"@format":"png",
"@height":"620.00",
"@type":"base64encoded",
"@width":"450.00",
"@x":"85.00",
"@y":"85.00"
}
},
{
"@index":"1",
"row":[
{
"column":[
{
"text":""
},
{
"text":{
"#text":"Text1",
"@fontName":"Arial",
"@fontSize":"12.0",
"@height":"12.00",
"@width":"71.04",
"@x":"121.10",
"@y":"83.42"
}
}
]
},
{
"column":[
{
"text":""
},
{
"text":{
"#text":"Text2",
"@fontName":"Arial",
"@fontSize":"12.0",
"@height":"12.00",
"@width":"101.07",
"@x":"121.10",
"@y":"124.82"
}
}
]
}
]
},
{
"@index":"2",
"row":[
{
"column":{
"text":{
"#text":"Text3",
"@fontName":"Arial",
"@fontSize":"12.0",
"@height":"12.00",
"@width":"363.44",
"@x":"85.10",
"@y":"69.62"
}
}
},
{
"column":{
"text":{
"#text":"Text4",
"@fontName":"Arial",
"@fontSize":"12.0",
"@height":"12.00",
"@width":"382.36",
"@x":"85.10",
"@y":"83.42"
}
}
},
{
"column":{
"text":{
"#text":"Text5",
"@fontName":"Arial",
"@fontSize":"12.0",
"@height":"12.00",
"@width":"435.05",
"@x":"85.10",
"@y":"97.22"
}
}
}
]
},
{
"@index":"3"
}
]
}
}
请您参考如下方法:
作为 json_normalize() 的替代方法,您还可以使用理解。:
my_dict["row"] = [{k: v for k, v in col_entry["text"].items()} for entry in my_dict["row"] for col_entry in entry["column"]]
编辑:固定代码以覆盖每个列列表中的多个条目。诚然,这确实接近理解嵌套方面的痛苦阈值......
