Я работаю над API, который возвращает JSON. Я записываю свои ответы, и иногда JSON просто абсурдно длинен и в основном забивает мои лог-файлы. Есть ли аккуратный способ уменьшить длину JSON, исключительно для визуальной регистрации данных? (не действует в производстве)
Основной подход c заключается в сокращении массивов на длину от 5 до [первые 2, "...", последние 2] и словари с более чем 4 пунктами в {первые 4, "...": "..."}
Код ниже уродлив. Я знаю, что это должно быть рекурсивное решение, которое сокращает элементы таким же образом для JSON произвольной глубины - в настоящее время оно делает это только для глубины 2.
def log_reducer(response_log):
original_response_log = response_log
try:
if type(response_log) == dict:
if len(response_log) >= 4: # {123456}
response_log = dict(list(response_log.items())[:4])
response_log.update({"...": "..."}) # {1234...}
for key, value in response_log.items():
if type(value) == list:
if len(value) >= 5: # {key:[123456]}
new_item = value[:2] + ['...'] + value[-2:] # {[12...56]}
response_log.update({key: new_item})
if type(value) == dict:
if len(value) >= 4: # {key:{123456}}
reduced_dict = dict(list(value.items())[:4])
reduced_dict.update({"...": "..."})
response_log.update({key: reduced_dict}) # {{1234...}}
elif type(response_log) == list:
if len(response_log) >= 5: # [123456]
response_log = response_log[:2] + ['...'] + response_log[-2:] # [12...56]
for inner_item in response_log:
if type(inner_item) == list:
if len(inner_item) >= 5: # [[123456]]
reduced_list = inner_item[:2] + ['...'] + inner_item[-2:] # [[12...56]]
response_log.remove(inner_item)
response_log.append(reduced_list)
if type(inner_item) == dict:
if len(inner_item) >= 4: # [{123456}]
reduced_dict = dict(list(inner_item.items())[:4])
reduced_dict.update({"...": "..."}) # [{1234...}]
response_log.remove(inner_item)
response_log.append(reduced_dict)
except Exception as e:
return original_response_log
return response_log
Возвращенный response_log тогда зарегистрировано с помощью logger.info (str (response_log))
Как видите, тот факт, что на каждом уровне могут быть либо массивы, либо словари, делает эту задачу немного более сложной, и я изо всех сил пытаюсь найти библиотека или код любого рода, который бы упростил это. Если кто-то захочет дать ему шанс, я был бы очень признателен.
Вы можете использовать тест JSON, подобный этому, чтобы увидеть его в действии:
test_json = {"works": [1, 2, 3, 4, 5, 6],
"not_affected": [{"1": "1", "2": "2", "3": "3", "4": "4", "5": "5"}],
"1": "1", "2": "2", "3": "3",
"removed": "removed"
}
print("original", test_json)
reduced_log = log_reducer(test_json)
print("reduced", reduced_log)
print("original", test_json)
reduced_log = log_reducer([test_json]) # <- increases nesting depth
print("reduced", reduced_log)