42

I was trying to check if objects were JSON serializable or not because I had a dictionary that had a bunch of things and at this point its just easier to loop through its keys and find if they are JSON serializable and remove them. Something like (though this checks if its function):

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

is there a way that the if statement instead check for JSON serializable objects and deletes them from the dictionary in a similar way to above?

Charlie Parker
  • 5,884
  • 57
  • 198
  • 323

2 Answers2

57

@shx2's answer is good enough, but it's better to specify which exceptions you're catching.

def is_jsonable(x):
    try:
        json.dumps(x)
        return True
    except (TypeError, OverflowError):
        return False

OverflowError is thrown when x contains a number which is too large for JSON to encode. A related answer can be found here.

R. Yang
  • 758
  • 6
  • 4
32

Easier to Ask Forgiveness than Permission.

import json
def is_jsonable(x):
    try:
        json.dumps(x)
        return True
    except:
        return False

Then in your code:

for key,value in arg_dict.items():
    if not is_jsonable(value):
        keys_to_delete.append(key)
shx2
  • 61,779
  • 13
  • 130
  • 153
  • 4
    that is hilariously smart, +1 for creativity for sure. – Charlie Parker Feb 03 '17 at 22:05
  • 8
    It's normally bad practice to catch all exception like that, it may masks bugs, either in the json implementation or in encoder hooks if you have any. @R. Yangs answer is better – Johan Dahlin Mar 25 '20 at 16:58
  • 1
    This is a terrible example for the statement 'Easier to Ask Forgiveness than Permission.'. – Marine Galantin Jan 10 '22 at 22:29
  • 2
    Don't use a wide 'except' like that as it catches KeyboardInterrupt errors too and makes your program unexitable from inside that try block. – Yoav Tulpan Mar 27 '22 at 16:32
  • This can be a very bad idea if your object happens to be serializable and occupies a few gigabytes of swap memory. Could take you the whole afternoon to find out if the object is serializable... – jacmkno Aug 30 '22 at 20:45