嵌套JSON到CSV

时间:2019-10-24 12:40:47

标签: python json csv

{
    "resources":{
        "har":"https://gtmetrix.com/api/0.1/test/TtGJTbkv/har",
        "screenshot":"https://gtmetrix.com/api/0.1/test/TtGJTbkv/screenshot",
        "video":"https://gtmetrix.com/api/0.1/test/TtGJTbkv/video",
        "filmstrip":"https://gtmetrix.com/api/0.1/test/TtGJTbkv/filmstrip",
        "report_pdf":"https://gtmetrix.com/api/0.1/test/TtGJTbkv/report-pdf",
        "report_pdf_full":"https://gtmetrix.com/api/0.1/test/TtGJTbkv/report-pdf?full=1",
        "pagespeed":"https://gtmetrix.com/api/0.1/test/TtGJTbkv/pagespeed",
        "pagespeed_files":"https://gtmetrix.com/api/0.1/test/TtGJTbkv/pagespeed-files",
        "yslow":"https://gtmetrix.com/api/0.1/test/TtGJTbkv/yslow"
    },
    "error":"",
    "results":{
        "report_url":"https://gtmetrix.com/reports/gtmetrix.com/Cz0AQOjf",
        "html_load_time":"87",
        "html_bytes":"3395",
        "page_load_time":"522",
        "page_bytes":"89229",
        "page_elements":"16",
        "pagespeed_score":"95",
        "yslow_score":"98"
    },
    "state":"completed"
}

我想将嵌套的json转换为csv文件。 我正在从Rest API接收json。 csv中的字段应如下所示。 resources.har,resources.screenshot,results.report_url等 我是Python和JSON的新手,所以希望获得一些帮助

2 个答案:

答案 0 :(得分:1)

您可以使用json_normalize将数据作为DataFrame加载到熊猫中,然后df.to_csv会将文件另存为csv。

import pandas as pd
from pandas.io.json import json_normalize

data = {
    'resources': {'har': 'https://gtmetrix.com/api/0.1/test/TtGJTbkv/har', 'screenshot': 'https://gtmetrix.com/api/0.1/test/TtGJTbkv/screenshot', 'video': 'https://gtmetrix.com/api/0.1/test/TtGJTbkv/video', 'filmstrip': 'https://gtmetrix.com/api/0.1/test/TtGJTbkv/filmstrip', 'report_pdf': 'https://gtmetrix.com/api/0.1/test/TtGJTbkv/report-pdf', 'report_pdf_full': 'https://gtmetrix.com/api/0.1/test/TtGJTbkv/report-pdf?full=1', 'pagespeed': 'https://gtmetrix.com/api/0.1/test/TtGJTbkv/pagespeed', 'pagespeed_files': 'https://gtmetrix.com/api/0.1/test/TtGJTbkv/pagespeed-files', 'yslow': 'https://gtmetrix.com/api/0.1/test/TtGJTbkv/yslow'}, 
    'error': '',
    'results': {'report_url': 'https://gtmetrix.com/reports/gtmetrix.com/Cz0AQOjf', 'html_load_time': '87', 'html_bytes': '3395', 'page_load_time': '522', 'page_bytes': '89229', 'page_elements': '16', 'pagespeed_score': '95', 'yslow_score': '98'}, 
    'state': 'completed'
}

json_normalize(data, sep='_').to_csv("filename.csv")

csv文件的内容如下:

,error,state,resources_har,resources_screenshot,resources_video,resources_filmstrip,resources_report_pdf,resources_report_pdf_full,resources_pagespeed,resources_pagespeed_files,resources_yslow,results_report_url,results_html_load_time,results_html_bytes,results_page_load_time,results_page_bytes,results_page_elements,results_pagespeed_score,results_yslow_score
0,,completed,https://gtmetrix.com/api/0.1/test/TtGJTbkv/har,https://gtmetrix.com/api/0.1/test/TtGJTbkv/screenshot,https://gtmetrix.com/api/0.1/test/TtGJTbkv/video,https://gtmetrix.com/api/0.1/test/TtGJTbkv/filmstrip,https://gtmetrix.com/api/0.1/test/TtGJTbkv/report-pdf,https://gtmetrix.com/api/0.1/test/TtGJTbkv/report-pdf?full=1,https://gtmetrix.com/api/0.1/test/TtGJTbkv/pagespeed,https://gtmetrix.com/api/0.1/test/TtGJTbkv/pagespeed-files,https://gtmetrix.com/api/0.1/test/TtGJTbkv/yslow,https://gtmetrix.com/reports/gtmetrix.com/Cz0AQOjf,87,3395,522,89229,16,95,98

如果您不想使用熊猫,可以手工编写转换并使用csv模块:

import csv

data = {
    'resources': {'har': 'https://gtmetrix.com/api/0.1/test/TtGJTbkv/har', 'screenshot': 'https://gtmetrix.com/api/0.1/test/TtGJTbkv/screenshot', 'video': 'https://gtmetrix.com/api/0.1/test/TtGJTbkv/video', 'filmstrip': 'https://gtmetrix.com/api/0.1/test/TtGJTbkv/filmstrip', 'report_pdf': 'https://gtmetrix.com/api/0.1/test/TtGJTbkv/report-pdf', 'report_pdf_full': 'https://gtmetrix.com/api/0.1/test/TtGJTbkv/report-pdf?full=1', 'pagespeed': 'https://gtmetrix.com/api/0.1/test/TtGJTbkv/pagespeed', 'pagespeed_files': 'https://gtmetrix.com/api/0.1/test/TtGJTbkv/pagespeed-files', 'yslow': 'https://gtmetrix.com/api/0.1/test/TtGJTbkv/yslow'}, 
    'error': '',
    'results': {'report_url': 'https://gtmetrix.com/reports/gtmetrix.com/Cz0AQOjf', 'html_load_time': '87', 'html_bytes': '3395', 'page_load_time': '522', 'page_bytes': '89229', 'page_elements': '16', 'pagespeed_score': '95', 'yslow_score': '98'}, 
    'state': 'completed'
}

data_out = {}
for k, v in data.items():
    if isinstance(v, dict):
        for ik, iv in v.items():
            data_out[f'{k}_{ik}'] = iv
    else:
        data_out[k] = iv

with open("filename.txt", 'w') as f:
    writer = csv.DictWriter(f, fieldnames=list(data_out))
    writer.writeheader()
    writer.writerow(data_out)

答案 1 :(得分:0)

最简单的解决方案是pandas json包。 假设您有sample_json_df。所需要做的只是:

from pandas.io.json import json_normalize
result = json_normalize(sample_json_df)
result.head()

给出所需的输出。