数量限制/用于记录的json长度

问题描述 投票:0回答:1

我正在使用一个返回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)
python json logging
1个回答
0
投票

您可以使用def __str __():方法覆盖python中的字典和列表的字符串表示形式。使用此功能仅可以在所有元素上递归调用print函数。它可以有一个简单的样板,如下所示:

def custom_print(obj):

    for item in obj:
        custom_print(

© www.soinside.com 2019 - 2024. All rights reserved.