у меня возникают проблемы с рекурсивной функцией, которую я пытаюсь сделать, поэтому я могу преобразовать 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
}
Это для вас?
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}