Модификация многоуровневого вложенного json с помощью python
Я хочу сопоставить значения json с помощью словаря data_mapping
И есть 4 правила
Во-первых, «по умолчанию» означает, должно ли это значение для ключа отображаться в значение для «default_value» в «сопоставлении» или нет.
Во-вторых, когда "по умолчанию" ложно, тогда значение json, которое соответствует ключу (a~z), должно быть отображено в значение сопоставления. Например, если ключ и значение json равны (e, None), тогда значение json должно быть изменено на 2 для ключа «e».
В-третьих, если значение для «default_value» имеет «значение ключа», которое уже существует в данных json, тогда поместите значение для ключа, получающего «значение ключа». Например, ключ «k» имеет значение по умолчанию, а значение по умолчанию относится к значению ключа «a». Таким образом, значение ключа «k» должно быть значением ключа «a».
Наконец, если значение default_value равно asis, используйте значение, как оно есть в json.
образец словаря data_mapping
data_mapping = {
"a" : {"default":True, "mapping":{"default_value":"1"}},
...
"e": {"default": False, "mapping": {"1": "1", "None": "2"}},
...
"k": {"default": True, "mapping": {"default_value":"a"}},
....
"z": {"default": True, "mapping":{"default_value":"asis"}},
}
образец "jsonstring". как показано в примере ниже, данные json имеют многоуровневый характер и поэтому являются вложенными.
this is my code
def recursive_replace(self, jsonstring, match, repl):
copied = jsonstring
todays_date = datetime.datetime.now()
if type(jsonstring) != type(None):
for k, v in jsonstring.items():
# print(k, match)
if k == match:
# print(k, v, match)
if k in DataMapping:
if DataMapping[k].get('default'):
cond = DataMapping[k].get('data_mapping').get('default')
if cond == 'asis' and len(v) > 0:
pass
elif cond == 'YEAR' and v is None:
datetimes = todays_date.strftime("%Y")
jsonstring[k] = datetimes
elif cond == 'DATE' and v is None:
datetimes = todays_date.strftime("%Y%m%d")
jsonstring[k] = datetimes
elif cond == 'DATETIME' and v is None:
datetimes = todays_date.strftime("%Y%m%d%H%M%S")
jsonstring[k] = datetimes
else:
pass
else:
cond = DataMapping[k].get('data_mapping').get('default')
# {"1": "1", "2": "2", "3": "3"}
print(type(cond), type(None), k)
if type(cond) != type(None):
for key, val in cond.items():
if key == k:
jsonstring[k] = val
else:
print(k)
print(k, v, jsonstring)
return k, v, jsonstring
elif isinstance(v, dict):
self.recursive_replace(v, match, repl)
elif isinstance(v, list):
for l in v:
if isinstance(l, dict):
self.recursive_replace(l, match, repl)
Я позвонил в recursive_replace
for el in keys:
# print(el)
self.recursive_replace(reorg_data, el,'')
все ключи в файле json включены в список «ключей».
Возвращается только тип, отличный от типа.
Не могли бы вы дать мне совет?