【问题标题】:Trying to convert a complex nested JSON schema into an Excel spreadsheet or CSV using Python [closed]尝试使用 Python 将复杂的嵌套 JSON 模式转换为 Excel 电子表格或 CSV [关闭]
【发布时间】:2021-09-03 13:43:59
【问题描述】:

我正在尝试使用 python 将复杂的 JSON 模式转换为简单的电子表格。我的 JSON 看起来像这样

{
  "type": "object",
  "properties": {
    "DataElement1": {
      "type": "string",
      "enum": [
        "SUCCESS",
        "ERROR"
      ],
      "description": "XXXXX."
    },
    "DataElement2": {
      "type": "object",
      "properties": {
        "DataElement3": {
          "type": "string",
          "description": "YYYYYY"
        },
        "DataElement4": {
          "type": "string",
          "description": "ZZZZZZ."
        }
      },
      "description": "AAAAAAAA"
    },
    "DataElement5": {
      "type": "object",
      "properties": {
        "DataElement6": {
          "type": "number",
          "description": "BBBBBBB"
        },
        "DataElement7": {
          "type": "string",
          "description": "CCCCCCCC"
        },
        "DataElement8": {
          "type": "number",
          "description": "DDDDDDDDD"
        },
         "required": [
        "DataElement6"
        ],
        "description": "EEEEEEEEEEE"
    }
 },
     "required": [
        "DataElement1",
        "DataElement2"
        ]
  
 }
}
    

输出应该只有 4 列,其中列出了所有不同的数据元素,如下所述。嵌套数据元素应与父数据元素组一起列出。

Data Element                | Type   | Description  | Required
DataElement1                | string | XXXX         | DataElement1
DataElement2                | string | AAAA         | DataElement2
DataElement2.DataElement3   | string | YYYY         | 
DataElement2.DataElement4   | string | ZZZZ         | 
DataElement5                | number |  EEEE        | 
DataElement5.DataElement6   | number |  BBBB        | DataElement6
DataElement5.DataElement7   | string |  CCCC        | 
DataElement5.DataElement8   | number |  DDDD        | 

谁能帮助分享一种使用 Python 将此 JSON 转换为 csv 格式的方法?

感谢您的帮助!


**

【问题讨论】:

  • 你什么都没试过吗?这不是代码编写服务。这不是一个“复杂的 JSON”。
  • DataElement2 和 DataElement5 肯定应该有 Type == 'object'。
  • 一个“模式”描述数据——它不是“实际”数据,所以除了一组没有实际数据行的 excel/CSV 标题之外,它不能变成任何东西,即它是将使用符合架构的数据填充的列的描述。
  • @TimRoberts 我对 python 编码相当陌生。我采用的方法是将完整的模式文件展平,然后将行映射到 csv 标题列。我能够展平文件,但将它们映射到列变得具有挑战性。也许方法本身不正确..我能够得到以下输出 - 类型:对象属性.DataElement1.type:字符串属性.DataElement1.enum[0]:成功属性.DataElement1.enum[1]:错误属性.DataElement1 .description :XXXXX。 properties.DataElement2.type : 对象

标签: python json pandas csv nested


【解决方案1】:

另一种方法:(你必须稍微调整一下

d = { ... your JSON structure ...} 

df = pd.json_normalize(d)
scols = pd.Series(df.columns.to_list()).str.replace('properties\\.','')
df.columns = scols.to_list()
tgt_cols = scols[scols.str.contains('DataElement') & (scols.str.contains('desc') | scols.str.contains('type') | scols.str.contains('required'))]

nd = {}

for x in tgt_cols:
    field = x.split(r'.')[-1]
    data_element = x.replace('.'+field, '')
    
    if data_element not in nd:
        nd[data_element] = {'Data Element': data_element}
        
    nd[data_element][field] = df.loc[0][x]

pd.DataFrame(list(nd.values()))

                Data Element    type  description        required
0               DataElement1  string       XXXXX.             NaN
1               DataElement2  object     AAAAAAAA             NaN
2  DataElement2.DataElement3  string       YYYYYY             NaN
3  DataElement2.DataElement4  string      ZZZZZZ.             NaN
4               DataElement5  object  EEEEEEEEEEE  [DataElement6]
5  DataElement5.DataElement6  number      BBBBBBB             NaN
6  DataElement5.DataElement7  string     CCCCCCCC             NaN
7  DataElement5.DataElement8  number    DDDDDDDDD             NaN

【讨论】:

    【解决方案2】:

    这似乎是你想要的。

    
    data = {
      "type": "object",
      "properties": {
        "DataElement1": {
          "type": "string",
          "enum": [
            "SUCCESS",
            "ERROR"
          ],
          "description": "XXXXX."
        },
        "DataElement2": {
          "type": "object",
          "properties": {
            "DataElement3": {
              "type": "string",
              "description": "YYYYYY"
            },
            "DataElement4": {
              "type": "string",
              "description": "ZZZZZZ."
            }
          },
          "description": "AAAAAAAA"
        },
        "DataElement5": {
          "type": "object",
          "properties": {
            "DataElement6": {
              "type": "number",
              "description": "BBBBBBB"
            },
            "DataElement7": {
              "type": "string",
              "description": "CCCCCCCC"
            },
            "DataElement8": {
              "type": "number",
              "description": "DDDDDDDDD"
            },
             "required": [
                "DataElement6"
            ]
          },
          "description": "EEEEEEEEEEE"
        },
         "required": [
            "DataElement1",
            "DataElement2"
            ]
      }
    }
    
    def handle_object( prefix, obj ):
        required = []
        if 'required' in obj['properties']:
            required = obj['properties']['required']
        for k,v in obj['properties'].items():
            if not isinstance(v,dict):
                continue
            name = '.'.join((prefix,k)) if prefix else k
            reqd = k if k in required else ''
            print( ','.join((name, v['type'], v['description'], reqd )))
    
            if v['type'] == 'object':
                handle_object( k, v )
    
    print("Data Element,Type,Description,Required")
    handle_object( '', data )
    

    输出:

    Data Element,Type,Description,Required
    DataElement1,string,XXXXX.,DataElement1
    DataElement2,object,AAAAAAAA,DataElement2
    DataElement2.DataElement3,string,YYYYYY,
    DataElement2.DataElement4,string,ZZZZZZ.,
    DataElement5,object,EEEEEEEEEEE,
    DataElement5.DataElement6,number,BBBBBBB,DataElement6
    DataElement5.DataElement7,string,CCCCCCCC,
    DataElement5.DataElement8,number,DDDDDDDDD,
    

    【讨论】:

      猜你喜欢
      • 2021-11-04
      • 1970-01-01
      • 2021-01-01
      • 2011-05-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多