рекурсивный читатель Python-JSON

1

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

в основном я пытаюсь организовать JSON файл в простой OrderedDict, поэтому я могу передать его в базу данных MongoDB

здесь рекурсивная функция:

def JSON_Treating(self,json_data):

    headers = []
    data = []
    for key, value in json_data.iteritems():
        headers.append(key)
        try:
            if isinstance(value, (dict,list)):
                if isinstance(value, list) and isinstance(value[0], dict):

                    value = value[0]

                self.JSON_treating(value)

            data.append(value)
        except:
            data.append(value)
            Dict = OrderedDict(zip(headers,dados))

            self.JSON_treating(Dict)


    return Dict

цель здесь заключается в том, что каждый раз, когда код находит вложенную таблицу, он получает свои заголовки и значения и добавляет заголовки к заголовкам и значениям в данные, а затем, когда он заканчивается, код будет соединяться с заголовками и значениями в порядке.

Моя проблема в том, что я не могу понять это правильно, см.... Либо код не получает все вложенные, либо код просто не работает. Пожалуйста, помогите Спасибо!

EDIT: вот пример ввода JSON

[
{
    "status": 0, 
    "payment_value": 0, 
    "date": "2018-07-28 12:18:00", 
    "Payment": [
        {
            "payment_general": 0, 
            "code": 1, 
            "total_value": 0, 
            "payment_form": "card"
        }
    ], 
    "id__": "", 
    "Product": [
        {
            "sku": "00000", 
            "ID_delivery": null, 
            "ammount": 1, 
            "unitary_value": 55.34, 
            "discount_name": null, 
            "delivery_form": null, 
            "discount_ammount": 0, 
            "delivery_charge": 20.34, 
            "taxes": 0, 
            "comission": null, 
            "id__discount": null
        }
    ], 
    "client": {
        "delivery": {
            "phone": [
                "1", 
                "2"
            ], 
            "fax": null, 
            "name": "A name here", 
            "state_tax": "free", 
            "address": {
                "reference": "a reference here", 
                "complement": "a complement here", 
                "block": "N123", 
                "city": "New York", 
                "road_name": "a road name", 
                "number": "413", 
                "postal_code": "123234", 
                "country": "US", 
                "State": "NY"
            }, 
            "email": "", 
            "document": ""
        }, 
        "taxation": {
            "phones": [
                "1", 
                "2"
            ], 
            "fax": null, 
            "type": "AN", 
            "nome": "a name here", 
            "state_demand": "A-B", 
            "birth_date": "1996-04-01", 
            "sex": "F-M", 
            "address": {
                "reference": "a reference here", 
                "complement": "a complement here", 
                "block": "N123", 
                "city": "New York", 
                "road_name": "a road name", 
                "number": "413", 
                "postal_code": "123234", 
                "country": "US", 
                "State": "NY"
            }, 
            "email": "a e mail ", 
            "document": "a document"
        }
    }, 
    "delivery_prevision": 10
}]

И вот как мне это нужно:

{
"status": 0, 
"payment_value": 0, 
"date": "2018-07-28 12:18:00", 
"Payment": ,

"payment_general": 0, 
"code": 1, 
"total_value": 0, 
"payment_form": "card", 
"id__": "", 
"Product":, 
"NDE": "00000", 
"ID_delivery": null, 
"ammount": 1, 
"unitary_value": 55.34, 
"discount_name": null, 
"delivery_form": null, 
"discount_ammount": 0, 
"delivery_charge": 20.34, 
"taxes": 0, 
"comission": null, 
"id__discount": null,
"client": ,
"delivery": ,
"phone": "1" "2",
"fax": null, 
"name": "A name here", 
"state_tax": "free", 
"address": ,
"reference": "a reference here", 
"complement": "a complement here", 
"block": "N123", 
"city": "New York", 
"road_name": "a road name", 
"number": "413", 
"postal_code": "123234", 
"country": "US", 
"State": "NY",

"taxation": ,
"phones": "1",  "2"

"fax": null, 
"type": "AN", 
"nome": "a name here", 
"state_demand": "A-B", 
"birth_date": "1996-04-01", 
"sex": "F-M", 
"address": ,
"reference": 
"a reference here", 
"complement": "a complement here", 
"block": "N123", 
"city": "New York", 
"road_name": "a road name", 
"number": "413", 
"postal_code": "123234", 
"country": "US", 
"State": "NY",
"email": "a e mail ", 
"document": "a document",
"delivery_prevision": 10
}
  • 0
    Вы пытаетесь сплющить JSON?
  • 1
    Как насчет показа вашего ввода? - и, возможно, желаемый результат тоже? Кроме того, py2?
Показать ещё 2 комментария
Теги:
recursion
pymongo

1 ответ

1
Лучший ответ

Это для вас?

class UnknownClassYouNeverShowed(object):
    def JSON_Treating(self, json_data):
        flat_dict = {}
        if isinstance(json_data, list):
            for item in json_data:
                if isinstance(item, (list, dict)):
                    flat_dict.update(self.JSON_Treating(item))
            return flat_dict

        for key, value in json_data.iteritems():
            if isinstance(value, (list, dict)):
                flat_dict.update(self.JSON_Treating(value))
            else:
                flat_dict[key] = value
        return flat_dict

Если у вас действительно есть строка json, загрузите ее и подайте в функцию, используя: import json; data = json.loads(some_json_string) import json; data = json.loads(some_json_string).. вы получаете идею.


Тестирование я получаю:

import pprint
unknown = UnknownClassYouNeverShowed()
pprint.pprint(unknown.JSON_Treating(data))

Выход:

{'ID_delivery': None,
 'State': 'NY',
 'ammount': 1,
 'birth_date': '1996-04-01',
 'block': 'N123',
 'city': 'New York',
 'code': 1,
 'comission': None,
 'complement': 'a complement here',
 'country': 'US',
 'date': '2018-07-28 12:18:00',
 'delivery_charge': 20.34,
 'delivery_form': None,
 'delivery_prevision': 10,
 'discount_ammount': 0,
 'discount_name': None,
 'document': 'a document',
 'email': 'a e mail ',
 'fax': None,
 'id__': '',
 'id__discount': None,
 'name': 'A name here',
 'nome': 'a name here',
 'number': '413',
 'payment_form': 'card',
 'payment_general': 0,
 'payment_value': 0,
 'postal_code': '123234',
 'reference': 'a reference here',
 'road_name': 'a road name',
 'sex': 'F-M',
 'sku': '00000',
 'state_demand': 'A-B',
 'state_tax': 'free',
 'status': 0,
 'taxes': 0,
 'total_value': 0,
 'type': 'AN',
 'unitary_value': 55.34}
  • 0
    Это работает, спасибо!

Ещё вопросы

Сообщество Overcoder
Наверх
Меню