ControllerActionInvoker

Раньше мне приходилось делать что-то вроде этого:

В основном выровняли весь вложенный json, затем итерировали по этим столбцам (который использует шаблон, чтобы включить, какая строка будет построена в таблицу) создать новые строки.

Есть 4 счета, и это создает 4 строки (для каждого счета). Надеюсь, это то, что вы ищете.

ПРИМЕЧАНИЕ Где вы можете столкнуться с некоторыми проблемами:

Одна из вещей, которую следует учитывать при попытке сгладить файл JSON, где есть вложенные списки, и вложенные списки имеют разную длину, каждый раз, когда одна строка имеет ОДНО значение для любого данного столбца, он должен создать этот столбец, даже если все остальные строки равны нулю. В этом ключе Payments есть списки с дополнительными 7 элементами. Поэтому, если для некоторых идентификаторов предусмотрено 8 платежей (в отличие от всех остальных, имеющих только 1 платеж), потребуется создать 56 дополнительных столбцов, чтобы хранить все эти данные в отдельных столбцах / плоском файле.

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)/
9
задан smartcaveman 20 March 2011 в 09:14
поделиться

1 ответ

По сути, это точка расширения класса Controller, которая позволяет вам получить доступ и влиять на взаимодействие контроллера с параметрами. , Фильтры и само действие. Когда запрос направляется на контроллер, контроллер просит ControllerActionInvoker обработать запрос (который обычно включает в себя вызов метода обратно на контроллере).

Основное использование этого, которое я видел до сих пор, заключается в обеспечьте внедрение зависимостей в Фильтры Действий, как показано здесь , но я уверен, что в будущем мы увидим больше вариантов использования этой функции!

14
ответ дан 4 December 2019 в 14:31
поделиться
Другие вопросы по тегам:

Похожие вопросы: