Good Evening Everyone: I would like to have this JSON object written out to a CSV file so that the keys are header fields (for each of the columns) and the values are values that are associated with each header field. Is there a best practice for working with this? Ideally I would like to recursively iterate through the key value pairs. Thank you in advance. I am using Python 3.4 on Windows. My editor is Sublime 2.
Here is the JSON object: { "Fee": { "A": "5", "FEC": "1/1/0001 12:00:00 AM", "TE": null, "Locator": null, "Message": "Transfer Fee", "AT": null, "FT": null, "FR": "True", "FY": null, "FR": null, "FG": "0", "Comment": null, "FUD": null, "cID": null, "GEO": null, "ISO": null, "TRID": null, "XTY": "931083", "ANM": null, "NM": null }, "CF": "Fee", "ID": "2" } The value, "Fee" associated with the key, "CF" should not be included as a column header (only as a value of the key "CF"). Other than the former, the keys should be headers and the corresponding tuples - the field values. In essence, my goal is to the following: You get a dictionary object (the "outer" dictionary) You get the data from the "CF" key (fixed name?) which is a string ("Fee" in your example) You use that value as a key to obtain another value from the same "outer" dictionary, which should be a another dictionary (the "inner" dictionary) You make a CSV file with: - a header that contains "CF" plus all keys in the "inner" dictionary that have an associated value - the value from key "CF" in the "outer" dictionary plus all non-null values in the "inner" dictionary. I have done the following: import csv import json import sys def hook(obj): return obj def flatten(obj): for k, v in obj: if isinstance(v, list): yield from flatten(v) else: yield k, v if __name__ == "__main__": with open("data.json") as f: data = json.load(f, object_pairs_hook=hook) pairs = list(flatten(data)) writer = csv.writer(sys.stdout) writer.writerow([k for k, v in pairs]) writer.writerow([v for k, v in pairs]) The output is as follows: $ python3 json2csv.py A,FEC,TE,Locator,Message,AT,FT,FR,FY,FR,FG,Comment,FUD, cID,GEO,ISO,TRID,XTY,ANM,NM,CF,ID 5,1/1/0001 12:00:00 AM,,,Transfer Fee,,,True,,,0,,,,,,,931083,,,Fee,2 I do not want to have duplicate column names. Any advice on other best practices that I may utilize?
-- https://mail.python.org/mailman/listinfo/python-list