首页 > 解决方案 > 将复杂的 JSON 导出为 CSV

问题描述

我有一个从 API 下载的 JSON 文件。目前,我已经能够将其导出为 JSON 并通过 Excel Power Query 准确解析数据。

数据按 Campaign IDS 划分(在本例中,只有两个),然后,按所选时间段的每一天,有几个不同的指标相关联。例如,这些是一些(不完整的)行,供您查看它应该如何工作。

campaignId  metadata.id  metrics.impressions   metrics.clicks
s00821idk   2019-05-19   12000293121           100
s00821idk   2019-05-18   12300223151           103

我尝试使用 Excel 来解析这些数据,这违背了使用 API 的目的。因为我是从 Python 导出的,所以通过 Excel 运行它,然后将它放在 Google Sheet 中。

我想在 Python 中进行所有转换,以便我可以使用 Google Sheets API 并将其放置在那里。

在以下链接中,我提供了导出的 JSON 文件。 文件

如果你能帮助我以这种方式构建数据,我会很高兴。太感谢了。

标签: pythonjsonpython-3.x

解决方案


如前所述,您需要完全展平多个嵌套值,迭代以获得您想要的。它可以完成,但它非常大(每个广告系列 id 有 24,000 多列),因此需要 2 分钟来遍历您提供的整个内容。

import json
import pandas as pd
import re


with open('C:/data.json') as f:
    jsonObj = json.load(f)


def flatten_json(y):
    out = {}
    def flatten(x, name=''):
        if type(x) is dict:
            for a in x:
                flatten(x[a], name + a + '_')
        elif type(x) is list:
            i = 0
            for a in x:
                flatten(a, name + str(i) + '_')
                i += 1
        else:
            out[name[:-1]] = x
    flatten(y)
    return out


flat = flatten_json(jsonObj)

results = pd.DataFrame()
special_cols = []

columns_list = list(flat.keys())
for item in columns_list:
    try:
        row_idx = re.findall(r'\_(\d+)\_', item )[0]
    except:
        special_cols.append(item)
        continue
    column = re.findall(r'\_\d+\_(.*)', item )[0]
    column = column.replace('_', '')

    row_idx = int(row_idx)
    value = flat[item]

    results.loc[row_idx, column] = value


for item in special_cols:
    results[item] = flat[item]

results.to_csv('file.csv', index=False)

输出:

print (results)
                           campaignId  ... totalCampaigns
0  0081da282b2dbe8140508074366cac91ba  ...              2
1  00c03d801da285767a093d0b4d5188fb34  ...              2

[2 rows x 24533 columns]

推荐阅读