使用Python将嵌套的JSON导出为CSV

时间:2019-03-11 13:57:43

标签: python json pandas nested

我有以下从Xero获得的JSON脚本。 这是一个嵌套的JSON脚本,我正在尝试创建一个平面表,然后将其导出为CSV。

我已经编写了此python代码,但是我在拼合嵌套的JSON脚本方面很费力。 最初,我从Xero获取数据,并使用 json.dumps 来序列化日期时间。此处显示的JSON导出来自Postman软件。当我使用python获取JSON脚本时,日期格式为以下'UpdatedDateUTC':datetime.datetime(2018、10、24、12、53、55、930000)。所以我使用 json.dumps 进行序列化。

当我进行第一次出口时:

df = pd.read_json(b_str)
df.to_csv(path+'invoices.csv')

CSV文件如下所示:

![enter image description here

下一步是将 Contact CreditNotes 列弄平,并使其成为主表的一部分。因此,除了 Contact 列之外,还有8个新列: ContactID,ContactNumber,姓名,地址,电话,ContactGroups,ContactPersons,HasValidationErrors 。 CreditNotes列的过程类似

我正在尝试在此link上复制方法,但是没有运气。我得到一个看起来像这样的出口。 contact_with_id数据框显示在多行而不是多列上。我不知道我在做什么错。

enter image description here

我也使用了flatten_json函数,但也没有运气。

我真的不需要使这种方法有效。我只想找到一种将嵌套的json脚本导出到可读的csv文件的方法。


Python代码:

from xero import Xero
from xero.auth import PrivateCredentials
with open("E:\\privatekey.pem") as keyfile:
    rsa_key = keyfile.read()
credentials = PrivateCredentials('BHK1ZBEKIL4WM0BLKLIOT65PSIA43N', rsa_key)
xero = Xero(credentials)

import json
import pandas as pd
from pandas.io.json import json_normalize #package for flattening json in pandas df

# The following is a list
a_list = xero.invoices.all()

# The following is a string. Serialised Datetime
b_str = json.dumps(a_list, default=str)

path='E:\\MyDrive\\Python Workspaces\\'
df = pd.read_json(b_str)
df.to_csv(path+'invoices.csv')

# ********************* FLATTEN JSON *****************

dd = json.loads(b_str)

contacts_with_id = pd.io.json.json_normalize(dd, record_path='Contact', meta='InvoiceID',
                                    record_prefix='Contact.')

df_final = pd.merge(contacts_with_id, df, how='inner', on='InvoiceID')
df_final.to_csv(path+'invoices_final.csv')

Json脚本如下:

{
"Id": "568d1686-7c53-4f22-a93f-754589a246a7",
"Status": "OK",
"ProviderName": "Rest API",
"DateTimeUTC": "/Date(1552234854959)/",
"Invoices": [
    {
        "Type": "ACCPAY",
        "InvoiceID": "8289ab9d-2134-4601-8622-e7fdae4b6d89",
        "InvoiceNumber": "10522",
        "Reference": "10522",
        "Payments": [],
        "CreditNotes": [],
        "Prepayments": [],
        "Overpayments": [],
        "AmountDue": 102,
        "AmountPaid": 0,
        "AmountCredited": 0,
        "CurrencyRate": 1,
        "HasErrors": false,
        "IsDiscounted": false,
        "HasAttachments": false,
        "Contact": {
            "ContactID": "d1dba397-0f0b-4819-a6ce-2839b7be5008",
            "ContactNumber": "c03bbcb5-fb0b-4f46-83f0-8687f754488b",
            "Name": "Micro",
            "Addresses": [],
            "Phones": [],
            "ContactGroups": [],
            "ContactPersons": [],
            "HasValidationErrors": false
        },
        "DateString": "2017-02-06T00:00:00",
        "Date": "/Date(1486339200000+0000)/",
        "DueDateString": "2017-03-08T00:00:00",
        "DueDate": "/Date(1488931200000+0000)/",
        "Status": "AUTHORISED",
        "LineAmountTypes": "Exclusive",
        "LineItems": [],
        "SubTotal": 85,
        "TotalTax": 17,
        "Total": 102,
        "UpdatedDateUTC": "/Date(1529940362110+0000)/",
        "CurrencyCode": "GBP"
    },
    {
        "Type": "ACCREC",
        "InvoiceID": "9e37150f-88a5-4213-a085-b30c5e01c2bf",
        "InvoiceNumber": "(13)",
        "Reference": "",
        "Payments": [],
        "CreditNotes": [
            {
                "CreditNoteID": "3c5c7dec-534a-46e0-ad1b-f0f69822cfd5",
                "CreditNoteNumber": "(12)",
                "ID": "3c5c7dec-534a-46e0-ad1b-f0f69822cfd5",
                "AppliedAmount": 1200,
                "DateString": "2011-05-04T00:00:00",
                "Date": "/Date(1304467200000+0000)/",
                "LineItems": [],
                "Total": 7800
            },
            {
                "CreditNoteID": "af38e37f-4ba3-4208-a193-a32b418c2bbc",
                "CreditNoteNumber": "(14)",
                "ID": "af38e37f-4ba3-4208-a193-a32b418c2bbc",
                "AppliedAmount": 2600,
                "DateString": "2011-05-04T00:00:00",
                "Date": "/Date(1304467200000+0000)/",
                "LineItems": [],
                "Total": 2600
            }
        ],
        "Prepayments": [],
        "Overpayments": [],
        "AmountDue": 0,
        "AmountPaid": 0,
        "AmountCredited": 3800,
        "CurrencyRate": 1,
        "HasErrors": false,
        "IsDiscounted": false,
        "HasAttachments": false,
        "Contact": {
            "ContactID": "58164bd6-5225-4f30-ad89-35140db5b624",
            "ContactNumber": "d0b420b8-4a58-40d1-9717-8525edda7658",
            "Name": "FSales (1)",
            "Addresses": [],
            "Phones": [],
            "ContactGroups": [],
            "ContactPersons": [],
            "HasValidationErrors": false
        },
        "DateString": "2011-05-04T00:00:00",
        "Date": "/Date(1304467200000+0000)/",
        "DueDateString": "2011-06-03T00:00:00",
        "DueDate": "/Date(1307059200000+0000)/",
        "Status": "PAID",
        "LineAmountTypes": "Exclusive",
        "LineItems": [],
        "SubTotal": 3166.67,
        "TotalTax": 633.33,
        "Total": 3800,
        "UpdatedDateUTC": "/Date(1529943661150+0000)/",
        "CurrencyCode": "GBP",
        "FullyPaidOnDate": "/Date(1304467200000+0000)/"
    },
    {
        "Type": "ACCPAY",
        "InvoiceID": "1ddea7ec-a0d5-457a-a8fd-cfcdc2099d51",
        "InvoiceNumber": "01596057543",
        "Reference": "",
        "Payments": [
            {
                "PaymentID": "fd639da3-c009-47df-a4bf-98ccd5c68e43",
                "Date": "/Date(1551657600000+0000)/",
                "Amount": 173.86,
                "Reference": "",
                "CurrencyRate": 1,
                "HasAccount": false,
                "HasValidationErrors": false
            }
        ],
        "CreditNotes": [],
        "Prepayments": [],
        "Overpayments": [],
        "AmountDue": 0,
        "AmountPaid": 173.86,
        "AmountCredited": 0,
        "CurrencyRate": 1,
        "HasErrors": false,
        "IsDiscounted": false,
        "HasAttachments": true,
        "Contact": {
            "ContactID": "309afb74-0a3b-4d68-85e8-2259ca5acd13",
            "ContactNumber": "91eef1f0-5fe6-45d7-b739-1ab5352a5523",
            "Name": "Company AAA",
            "Addresses": [],
            "Phones": [],
            "ContactGroups": [],
            "ContactPersons": [],
            "HasValidationErrors": false
        },
        "DateString": "2019-02-23T00:00:00",
        "Date": "/Date(1550880000000+0000)/",
        "DueDateString": "2019-03-21T00:00:00",
        "DueDate": "/Date(1553126400000+0000)/",
        "Status": "PAID",
        "LineAmountTypes": "Exclusive",
        "LineItems": [],
        "SubTotal": 144.88,
        "TotalTax": 28.98,
        "Total": 173.86,
        "UpdatedDateUTC": "/Date(1551777481907+0000)/",
        "CurrencyCode": "GBP",
        "FullyPaidOnDate": "/Date(1551657600000+0000)/"
    },
    {
        "Type": "ACCPAY",
        "InvoiceID": "ba5ff3b1-1058-4645-80da-5475c23da949",
        "InvoiceNumber": "Q0603",
        "Reference": "",
        "Payments": [],
        "CreditNotes": [],
        "Prepayments": [],
        "Overpayments": [],
        "AmountDue": 213.24,
        "AmountPaid": 0,
        "AmountCredited": 0,
        "CurrencyRate": 1,
        "HasErrors": false,
        "IsDiscounted": false,
        "HasAttachments": true,
        "Contact": {
            "ContactID": "f0473b41-da92-4397-9d2c-741812f2475c",
            "ContactNumber": "1f124969-de8d-40b8-8140-d4997511b0dc",
            "Name": "BTelcom",
            "Addresses": [],
            "Phones": [],
            "ContactGroups": [],
            "ContactPersons": [],
            "HasValidationErrors": false
        },
        "DateString": "2019-03-05T00:00:00",
        "Date": "/Date(1551744000000+0000)/",
        "DueDateString": "2019-03-21T00:00:00",
        "DueDate": "/Date(1553126400000+0000)/",
        "Status": "SUBMITTED",
        "LineAmountTypes": "Exclusive",
        "LineItems": [],
        "SubTotal": 177.7,
        "TotalTax": 35.54,
        "Total": 213.24,
        "UpdatedDateUTC": "/Date(1552068778417+0000)/",
        "CurrencyCode": "GBP"
    }
]

}

1 个答案:

答案 0 :(得分:0)

我之前必须做过这样的事情:

基本上将整个嵌套的json展平,然后遍历这些列(该列使用一种模式来将其构造成表格的行包括在内)以创建新行。

有4张发票,这将创建4行(对于每个发票)。希望这就是您要寻找的。

注意 :您可能会遇到的一些问题:

如果要弄平其中有嵌套列表且嵌套列表具有不同长度的json文件,则要考虑的事情之一,只要任何一行的任何给定列具有一个值,它都必须创建该列即使所有其他行均为空。在该Payments键中,有包含其他7个元素的列表。因此,如果某些ID有8笔付款(相对于其他所有ID只有1笔付款),则必须另外创建56列以将所有ID存储在单独的列/平面文件中。

jsonStr = '''{
"Id": "568d1686-7c53-4f22-a93f-754589a246a7",
"Status": "OK",
"ProviderName": "Rest API",
"DateTimeUTC": "/Date(1552234854959)/",
"Invoices": [
    {
        "Type": "ACCPAY",
        "InvoiceID": "8289ab9d-2134-4601-8622-e7fdae4b6d89",
        "InvoiceNumber": "10522",
        "Reference": "10522",
        "Payments": [],
        "CreditNotes": [],
        "Prepayments": [],
        "Overpayments": [],
        "AmountDue": 102,
        "AmountPaid": 0,
        "AmountCredited": 0,
        "CurrencyRate": 1,
        "HasErrors": false,
        "IsDiscounted": false,
        "HasAttachments": false,
        "Contact": {
            "ContactID": "d1dba397-0f0b-4819-a6ce-2839b7be5008",
            "ContactNumber": "c03bbcb5-fb0b-4f46-83f0-8687f754488b",
            "Name": "Micro",
            "Addresses": [],
            "Phones": [],
            "ContactGroups": [],
            "ContactPersons": [],
            "HasValidationErrors": false
        },
        "DateString": "2017-02-06T00:00:00",
        "Date": "/Date(1486339200000+0000)/",
        "DueDateString": "2017-03-08T00:00:00",
        "DueDate": "/Date(1488931200000+0000)/",
        "Status": "AUTHORISED",
        "LineAmountTypes": "Exclusive",
        "LineItems": [],
        "SubTotal": 85,
        "TotalTax": 17,
        "Total": 102,
        "UpdatedDateUTC": "/Date(1529940362110+0000)/",
        "CurrencyCode": "GBP"
    },
    {
        "Type": "ACCREC",
        "InvoiceID": "9e37150f-88a5-4213-a085-b30c5e01c2bf",
        "InvoiceNumber": "(13)",
        "Reference": "",
        "Payments": [],
        "CreditNotes": [
            {
                "CreditNoteID": "3c5c7dec-534a-46e0-ad1b-f0f69822cfd5",
                "CreditNoteNumber": "(12)",
                "ID": "3c5c7dec-534a-46e0-ad1b-f0f69822cfd5",
                "AppliedAmount": 1200,
                "DateString": "2011-05-04T00:00:00",
                "Date": "/Date(1304467200000+0000)/",
                "LineItems": [],
                "Total": 7800
            },
            {
                "CreditNoteID": "af38e37f-4ba3-4208-a193-a32b418c2bbc",
                "CreditNoteNumber": "(14)",
                "ID": "af38e37f-4ba3-4208-a193-a32b418c2bbc",
                "AppliedAmount": 2600,
                "DateString": "2011-05-04T00:00:00",
                "Date": "/Date(1304467200000+0000)/",
                "LineItems": [],
                "Total": 2600
            }
        ],
        "Prepayments": [],
        "Overpayments": [],
        "AmountDue": 0,
        "AmountPaid": 0,
        "AmountCredited": 3800,
        "CurrencyRate": 1,
        "HasErrors": false,
        "IsDiscounted": false,
        "HasAttachments": false,
        "Contact": {
            "ContactID": "58164bd6-5225-4f30-ad89-35140db5b624",
            "ContactNumber": "d0b420b8-4a58-40d1-9717-8525edda7658",
            "Name": "FSales (1)",
            "Addresses": [],
            "Phones": [],
            "ContactGroups": [],
            "ContactPersons": [],
            "HasValidationErrors": false
        },
        "DateString": "2011-05-04T00:00:00",
        "Date": "/Date(1304467200000+0000)/",
        "DueDateString": "2011-06-03T00:00:00",
        "DueDate": "/Date(1307059200000+0000)/",
        "Status": "PAID",
        "LineAmountTypes": "Exclusive",
        "LineItems": [],
        "SubTotal": 3166.67,
        "TotalTax": 633.33,
        "Total": 3800,
        "UpdatedDateUTC": "/Date(1529943661150+0000)/",
        "CurrencyCode": "GBP",
        "FullyPaidOnDate": "/Date(1304467200000+0000)/"
    },
    {
        "Type": "ACCPAY",
        "InvoiceID": "1ddea7ec-a0d5-457a-a8fd-cfcdc2099d51",
        "InvoiceNumber": "01596057543",
        "Reference": "",
        "Payments": [
            {
                "PaymentID": "fd639da3-c009-47df-a4bf-98ccd5c68e43",
                "Date": "/Date(1551657600000+0000)/",
                "Amount": 173.86,
                "Reference": "",
                "CurrencyRate": 1,
                "HasAccount": false,
                "HasValidationErrors": false
            }
        ],
        "CreditNotes": [],
        "Prepayments": [],
        "Overpayments": [],
        "AmountDue": 0,
        "AmountPaid": 173.86,
        "AmountCredited": 0,
        "CurrencyRate": 1,
        "HasErrors": false,
        "IsDiscounted": false,
        "HasAttachments": true,
        "Contact": {
            "ContactID": "309afb74-0a3b-4d68-85e8-2259ca5acd13",
            "ContactNumber": "91eef1f0-5fe6-45d7-b739-1ab5352a5523",
            "Name": "Company AAA",
            "Addresses": [],
            "Phones": [],
            "ContactGroups": [],
            "ContactPersons": [],
            "HasValidationErrors": false
        },
        "DateString": "2019-02-23T00:00:00",
        "Date": "/Date(1550880000000+0000)/",
        "DueDateString": "2019-03-21T00:00:00",
        "DueDate": "/Date(1553126400000+0000)/",
        "Status": "PAID",
        "LineAmountTypes": "Exclusive",
        "LineItems": [],
        "SubTotal": 144.88,
        "TotalTax": 28.98,
        "Total": 173.86,
        "UpdatedDateUTC": "/Date(1551777481907+0000)/",
        "CurrencyCode": "GBP",
        "FullyPaidOnDate": "/Date(1551657600000+0000)/"
    },
    {
        "Type": "ACCPAY",
        "InvoiceID": "ba5ff3b1-1058-4645-80da-5475c23da949",
        "InvoiceNumber": "Q0603",
        "Reference": "",
        "Payments": [],
        "CreditNotes": [],
        "Prepayments": [],
        "Overpayments": [],
        "AmountDue": 213.24,
        "AmountPaid": 0,
        "AmountCredited": 0,
        "CurrencyRate": 1,
        "HasErrors": false,
        "IsDiscounted": false,
        "HasAttachments": true,
        "Contact": {
            "ContactID": "f0473b41-da92-4397-9d2c-741812f2475c",
            "ContactNumber": "1f124969-de8d-40b8-8140-d4997511b0dc",
            "Name": "BTelcom",
            "Addresses": [],
            "Phones": [],
            "ContactGroups": [],
            "ContactPersons": [],
            "HasValidationErrors": false
        },
        "DateString": "2019-03-05T00:00:00",
        "Date": "/Date(1551744000000+0000)/",
        "DueDateString": "2019-03-21T00:00:00",
        "DueDate": "/Date(1553126400000+0000)/",
        "Status": "SUBMITTED",
        "LineAmountTypes": "Exclusive",
        "LineItems": [],
        "SubTotal": 177.7,
        "TotalTax": 35.54,
        "Total": 213.24,
        "UpdatedDateUTC": "/Date(1552068778417+0000)/",
        "CurrencyCode": "GBP"
    }
]
}'''



import json
import pandas as pd
import re

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

jsonObj = json.loads(jsonStr)
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]

输出:

print (results.to_string())
     Type                             InvoiceID InvoiceNumber Reference  AmountDue  AmountPaid  AmountCredited  CurrencyRate  HasErrors  IsDiscounted  HasAttachments                      ContactContactID                  ContactContactNumber  ContactName  ContactHasValidationErrors           DateString                        Date        DueDateString                     DueDate Status LineAmountTypes  SubTotal  TotalTax    Total              UpdatedDateUTC CurrencyCode              CreditNotes0CreditNoteID CreditNotes0CreditNoteNumber                        CreditNotes0ID  CreditNotes0AppliedAmount CreditNotes0DateString            CreditNotes0Date  CreditNotes0Total              CreditNotes1CreditNoteID CreditNotes1CreditNoteNumber                        CreditNotes1ID  CreditNotes1AppliedAmount CreditNotes1DateString            CreditNotes1Date  CreditNotes1Total             FullyPaidOnDate                    Payments0PaymentID               Payments0Date  Payments0Amount Payments0Reference  Payments0CurrencyRate Payments0HasAccount Payments0HasValidationErrors                                    Id ProviderName            DateTimeUTC
0  ACCPAY  8289ab9d-2134-4601-8622-e7fdae4b6d89         10522     10522     102.00        0.00             0.0           1.0      False         False           False  d1dba397-0f0b-4819-a6ce-2839b7be5008  c03bbcb5-fb0b-4f46-83f0-8687f754488b        Micro                       False  2017-02-06T00:00:00  /Date(1486339200000+0000)/  2017-03-08T00:00:00  /Date(1488931200000+0000)/     OK       Exclusive     85.00     17.00   102.00  /Date(1529940362110+0000)/          GBP                                   NaN                          NaN                                   NaN                        NaN                    NaN                         NaN                NaN                                   NaN                          NaN                                   NaN                        NaN                    NaN                         NaN                NaN                         NaN                                   NaN                         NaN              NaN                NaN                    NaN                 NaN                          NaN  568d1686-7c53-4f22-a93f-754589a246a7     Rest API  /Date(1552234854959)/
1  ACCREC  9e37150f-88a5-4213-a085-b30c5e01c2bf          (13)                 0.00        0.00          3800.0           1.0      False         False           False  58164bd6-5225-4f30-ad89-35140db5b624  d0b420b8-4a58-40d1-9717-8525edda7658   FSales (1)                       False  2011-05-04T00:00:00  /Date(1304467200000+0000)/  2011-06-03T00:00:00  /Date(1307059200000+0000)/     OK       Exclusive   3166.67    633.33  3800.00  /Date(1529943661150+0000)/          GBP  3c5c7dec-534a-46e0-ad1b-f0f69822cfd5                         (12)  3c5c7dec-534a-46e0-ad1b-f0f69822cfd5                     1200.0    2011-05-04T00:00:00  /Date(1304467200000+0000)/             7800.0  af38e37f-4ba3-4208-a193-a32b418c2bbc                         (14)  af38e37f-4ba3-4208-a193-a32b418c2bbc                     2600.0    2011-05-04T00:00:00  /Date(1304467200000+0000)/             2600.0  /Date(1304467200000+0000)/                                   NaN                         NaN              NaN                NaN                    NaN                 NaN                          NaN  568d1686-7c53-4f22-a93f-754589a246a7     Rest API  /Date(1552234854959)/
2  ACCPAY  1ddea7ec-a0d5-457a-a8fd-cfcdc2099d51   01596057543                 0.00      173.86             0.0           1.0      False         False            True  309afb74-0a3b-4d68-85e8-2259ca5acd13  91eef1f0-5fe6-45d7-b739-1ab5352a5523  Company AAA                       False  2019-02-23T00:00:00  /Date(1550880000000+0000)/  2019-03-21T00:00:00  /Date(1553126400000+0000)/     OK       Exclusive    144.88     28.98   173.86  /Date(1551777481907+0000)/          GBP                                   NaN                          NaN                                   NaN                        NaN                    NaN                         NaN                NaN                                   NaN                          NaN                                   NaN                        NaN                    NaN                         NaN                NaN  /Date(1551657600000+0000)/  fd639da3-c009-47df-a4bf-98ccd5c68e43  /Date(1551657600000+0000)/           173.86                                       1.0               False                        False  568d1686-7c53-4f22-a93f-754589a246a7     Rest API  /Date(1552234854959)/
3  ACCPAY  ba5ff3b1-1058-4645-80da-5475c23da949         Q0603               213.24        0.00             0.0           1.0      False         False            True  f0473b41-da92-4397-9d2c-741812f2475c  1f124969-de8d-40b8-8140-d4997511b0dc      BTelcom                       False  2019-03-05T00:00:00  /Date(1551744000000+0000)/  2019-03-21T00:00:00  /Date(1553126400000+0000)/     OK       Exclusive    177.70     35.54   213.24  /Date(1552068778417+0000)/          GBP                                   NaN                          NaN                                   NaN                        NaN                    NaN                         NaN                NaN                                   NaN                          NaN                                   NaN                        NaN                    NaN                         NaN                NaN                         NaN                                   NaN                         NaN              NaN                NaN                    NaN                 NaN                          NaN  568d1686-7c53-4f22-a93f-754589a246a7     Rest API  /Date(1552234854959)/