Модификация многоуровневого вложенного 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 включены в список «ключей».

Возвращается только тип, отличный от типа.

Не могли бы вы дать мне совет?

0 ответов

Другие вопросы по тегам