有没有一种简单的方法来检查对象是否在python中是可序列化的?

Pin*_*hio 12 python serialization json

我试图检查对象是否是JSON可序列化的,因为我有一个包含大量内容的字典,此时它更容易遍历其键并查找它们是否是JSON可序列化并删除它们.像(虽然这检查它的功能):

def remove_functions_from_dict(arg_dict):
    '''
        Removes functions from dictionary and returns modified dictionary
    '''
    keys_to_delete = []
    for key,value in arg_dict.items():
        if hasattr(value, '__call__'):
            keys_to_delete.append(key)
    for key in keys_to_delete:
        del arg_dict[key]
    return arg_dict
Run Code Online (Sandbox Code Playgroud)

是否有一种方法,if语句代替检查JSON可序列化对象,并以类似于上面的方式从字典中删除它们?

shx*_*hx2 24

比宽容更容易请求宽恕.

import json
def is_jsonable(x):
    try:
        json.dumps(x)
        return True
    except:
        return False
Run Code Online (Sandbox Code Playgroud)

然后在你的代码中:

for key,value in arg_dict.items():
    if not is_jsonable(value):
        keys_to_delete.append(key)
Run Code Online (Sandbox Code Playgroud)

  • 捕获所有这样的异常通常是不好的做法,它可能会掩盖错误,无论是在 json 实现中还是在编码器挂钩中(如果有的话)。@R。杨老师的回答比较好 (3认同)
  • 这非常有趣,肯定会为创意+1。 (2认同)
  • 不要使用像这样的宽“例外”,因为它也会捕获 KeyboardInterrupt 错误,并使您的程序无法从该 try 块内退出。 (2认同)

小智 10

@ shx2的答案足够好,但是最好指定要捕获的异常。

def is_jsonable(x):
    try:
        json.dumps(x)
        return True
    except (TypeError, OverflowError):
        return False
Run Code Online (Sandbox Code Playgroud)

当x包含一个太大而JSON无法编码的数字时,抛出OverflowError。一个相关的答案可以在这里找到。