Получение последних пяти транзакций, выполненных конкретным идентификатором транзакции из файла JSON - PullRequest
0 голосов
/ 10 июня 2019

Я пишу скрипт на python, который должен получать данные из объекта JSON, и для каждого экземпляра ключа словаря с именем «actionID »программа должна иметь возможность возвращать последние пять транзакций, выполненных конкретным ID транзакции. Я не уверен, как продолжить после импорта файла JSON, получения из файла словаря, содержащего поле'actionID ', и сохранения его в списке с именемaction_details. Объект JSON представлен в следующем формате:

[{
    "transactionData":{
                    "transactionID":"tyeeeg5667557", 
                    "deviceID": "uasjaslsa", 
                    "IMEI":"ssjdjdssd", 
                    "transactionDate": "12-12-2019", 
                    "time": "11:40", 
                    "accountDetails": {"userID": "kilopol", "creationdate": "21-12-2019"}, 
                    "Amount": {"amount": 2000, "units": "UGX", "qty":1}, 
                    "paymentMethod": {"name": "mobile money"}, 
                    "productdetails": {"productid": "12jfjf", "name": "airtime", "units":"UGX"}
                    },
"locationdetails": {"address":"Ntinda-Kampala", "street": "Chwa 2 Ntinda-Nakawa"},
"api key": "a9dd1d0f-a605-499a-9618-c449065d34bb", 
"callbackUrl": "http://clinet.com/method", 
"clientid": "5ce7baf3ffd59f2633ed64a3", 
"receptiontime": 1559297122942
},
{
    "transactionData":{
                    "transactionID":"yetrw5667557", 
                    "deviceID": "uweyjaslsa", 
                    "IMEI":"ssycvjdssd", 
                    "transactionDate": "12-12-2019", 
                    "time": "11:40", 
                    "accountDetails": {"userID": "kimange", "creationdate": "21-12-2019"}, 
                    "Amount": {"amount": 4000, "units": "UGX", "qty":2}, 
                    "paymentMethod": {"name": "airtel money"}, 
                    "productdetails": {"productid": "12jfjf", "name": "airtime", "units":"UGX"}
                    },
"locationdetails": {"address":"Kamwokya-Kampala", "street": "Chwa 2 Ntinda-Nakawa"},
"api key": "a9dd1d0f-a605-499a-9618-c449065d34bb", 
"callbackUrl": "http://clinet.com/method", 
"clientid": "5ce7bafutwf2633ed64a3", 
"receptiontime": 1559297122942
},
{
    "transactionData":{
                    "transactionID":"tyeeeg5667557", 
                    "deviceID": "uweyjaslsa", 
                    "IMEI":"ssycvjdssd", 
                    "transactionDate": "12-12-2019", 
                    "time": "11:40", 
                    "accountDetails": {"userID": "kimange", "creationdate": "21-12-2019"}, 
                    "Amount": {"amount": 4000, "units": "UGX", "qty":2}, 
                    "paymentMethod": {"name": "airtel money"}, 
                    "productdetails": {"productid": "12jfjf", "name": "airtime", "units":"UGX"}
                    },
"locationdetails": {"address":"Kamwokya-Kampala", "street": "Chwa 2 Ntinda-Nakawa"},
"api key": "a9dd1d0f-a605-499a-9618-c449065d34bb", 
"callbackUrl": "http://clinet.com/method", 
"clientid": "5ce7bafutwf2633ed64a3", 
"receptiontime": 1559297122942
},
{
"transactionData":{
                    "transactionID":"tyeeeg5667557", 
                    "deviceID": "uasjaslsa", 
                    "IMEI":"ssjdjdssd", 
                    "transactionDate": "12-12-2019", 
                    "time": "11:40", 
                    "accountDetails": {"userID": "kilopol", "creationdate": "21-12-2019"}, 
                    "Amount": {"amount": 2000, "units": "UGX", "qty":1}, 
                    "paymentMethod": {"name": "mobile money"}, 
                    "productdetails": {"productid": "12jfjf", "name": "airtime", "units":"UGX"}
                    },
"locationdetails": {"address":"Gulu", "street": "Burton Street"},
"api key": "a9dd1d0f-a605-499a-9618-c449065d34bb", 
"callbackUrl": "http://clinet.com/method", 
"clientid": "5ce7baf3ffd59f2633ed64a3", 
"receptiontime": 1559297122942
},
{
"transactionData":{
                    "transactionID":"tyeeeg5667557", 
                    "deviceID": "uasjaslsa", 
                    "IMEI":"ssjdjdssd", 
                    "transactionDate": "12-12-2019", 
                    "time": "11:40", 
                    "accountDetails": {"userID": "kilopol", "creationdate": "21-12-2019"}, 
                    "Amount": {"amount": 2000, "units": "UGX", "qty":1}, 
                    "paymentMethod": {"name": "mobile money"}, 
                    "productdetails": {"productid": "12jfjf", "name": "airtime", "units":"UGX"}
                    },
"locationdetails": {"address":"Ntinda-Kampala", "street": "Chwa 2 Ntinda-Nakawa"},
"api key": "a9dd1d0f-a605-499a-9618-c449065d34bb", 
"callbackUrl": "http://clinet.com/method", 
"clientid": "5ce7baf3ffd59f2633ed64a3", 
"receptiontime": 1559297122942
},
{
"transactionData":{
                    "transactionID":"ygdras557", 
                    "deviceID": "uasjaslsa", 
                    "IMEI":"ssjdjdssd", 
                    "transactionDate": "12-12-2019", 
                    "time": "11:40", 
                    "accountDetails": {"userID": "kilopol", "creationdate": "21-12-2019"}, 
                    "Amount": {"amount": 2000, "units": "UGX", "qty":1}, 
                    "paymentMethod": {"name": "mobile money"}, 
                    "productdetails": {"productid": "12jfjf", "name": "airtime", "units":"UGX"}
                    },
"locationdetails": {"address":"Ntinda-Kampala", "street": "Chwa 2 Ntinda-Nakawa"},
"api key": "a9dd1d0f-a605-499a-9618-c449065d34bb", 
"callbackUrl": "http://clinet.com/method", 
"clientid": "5ce7baf3ffd59f2633ed64a3", 
"receptiontime": 1559297122942
},
{
    "transactionData":{
                    "transactionID":"tyeeeg5667557", 
                    "deviceID": "uasjaslsa", 
                    "IMEI":"ssjdjdssd", 
                    "transactionDate": "7-7-2019", 
                    "time": "11:40", 
                    "accountDetails": {"userID": "kilopol", "creationdate": "21-12-2019"}, 
                    "Amount": {"amount": 6700, "units": "UGX", "qty":1}, 
                    "paymentMethod": {"name": "mobile money"}, 
                    "productdetails": {"productid": "12jfjf", "name": "airtime", "units":"UGX"}
                    },
"locationdetails": {"address":"Ntinda-Kampala", "street": "Chwa 2 Ntinda-Nakawa"},
"api key": "a9dd3d9f-a605-499a-9618-c449065d34bb", 
"callbackUrl": "http://clinet.com/method", 
"clientid": "5ce7baf3ffd59f2633ed64a3", 
"receptiontime": 1559297122942
}
]

Мне нужна помощь в реализации этого, продолжая с кода ниже, начиная с того момента, когда я создал список с именемaction_details для хранения словаря, содержащего ключ транзакцииID.

from pymongo import MongoClient
import json


class ExtractData(object):
    def __init__(self, file):
        self.file = file

    def obtainLastFiveTransactions(self):
        client = MongoClient('localhost', 27017)
        database = client['database']
        collection = database['collection']

        with open(self.file) as f_obj:
            data_file = json.load(f_obj)
            collection.insert_many(data_file)
            data_received = collection.find({})

            for dict_data in data_received:
                for key, value in dict_data.items():
                    if key == 'transactionData':
                        transactionDataValues = value
                        transaction_details = []
                        for key, value in transactionDataValues.items():
                            if key == 'transactionID':
                                transaction_details.append(transactionDataValues)

1 Ответ

1 голос
/ 10 июня 2019

Возможно, это не самое эффективное решение, но этот фрагмент читает json, создает словарь, содержащий идентификатор транзакции в качестве ключей, и затем добавляет 5 новейших транзакций, отсортированных по транзакции в словарь.

Для всех идентификаторов транзакции:

import json
from datetime import datetime

transaction_dict = {}

with open(json_file) as f_obj:
    data = json.load(f_obj)

    # Sort list of transactions by transactionDate
    data_sorted = sorted(
        data,
        key=lambda k: datetime.strptime(k['transactionData']['transactionDate'], "%d-%m-%Y").timestamp(),
        reverse=True
)

    # Make a dictionary with transactionIds as keys
    for transaction in data_sorted:
        transactionId = transaction['transactionData']['transactionID']
        transaction_dict[transactionId] = []

    # Append the 5 newest transaction for appropriate key
    for transaction in data_sorted:
        transactionId = transaction['transactionData']['transactionID']
        if len(transaction_dict[transactionId]) < 6:
            transaction_dict[transactionId].append(transaction)

Для конкретной транзакции:

import json
from datetime import datetime

transaction_key = 'xxxx'
transaction_dict = {
    transaction_key: []
}

transactions = []

with open(json_file) as f_obj:
    data = json.load(f_obj)

    for transaction in data:
        if transaction['transactionData']['transactionID'] == transaction_key:
            transactions.append(transaction)

    # Sort list of transactions by transactionDate
    data_sorted = sorted(
        transactions,
        key=lambda k: datetime.strptime(k['transactionData']['transactionDate'], "%d-%m-%Y").timestamp(),
        reverse=True
    )

    # Append the 5 newest transaction for appropriate key
    for transaction in transactions:
        if len(transaction_dict[transaction_key]) < 6:
            transaction_dict[transaction_key].append(transaction)

Надеюсь, это немного поможет!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...