我正在使用一个返回JSON的API。我正在记录我的响应,有时JSON太长了,基本上阻塞了我的日志文件。是否有一种纯粹用于可视化记录数据的减少JSON长度的简洁方法? (在生产中无效)
基本方法是将长度超过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
然后使用logger.info(str(response_log))记录返回的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)
您可以使用def __str __():方法覆盖python中的字典和列表的字符串表示形式。使用此功能仅可以在所有元素上递归调用print函数。它可以有一个简单的样板,如下所示:
def custom_print(obj):
for item in obj:
custom_print(