Skip to main content
 首页 » 编程设计

python之将 4 层嵌套的 JSON 文件转换为 1 层嵌套的 Python

2025年05月04日20lonelyxmas

我有下面的 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"]] 

编辑:固定代码以覆盖每个列列表中的多个条目。诚然,这确实接近理解嵌套方面的痛苦阈值......