seperman / deepdiff

DeepDiff: Deep Difference and search of any Python object/data. DeepHash: Hash of any object based on its contents. Delta: Use deltas to reconstruct objects by adding deltas together.
http://zepworks.com
Other
2.01k stars 219 forks source link

to_dict() method chokes on standard json.dumps() kwargs #490

Open droneshire opened 2 weeks ago

droneshire commented 2 weeks ago

Describe the bug Exception is thrown when using the sort_keys=True kwarg when using the to_json() method of a deepdiff.Deepdiff() object.

The bug is in the serialization.py code if orjson is defined/used:

def json_dumps(item, default_mapping=None, **kwargs):
    """
    Dump json with extra details that are not normally json serializable
    """
    if orjson:
        indent = kwargs.pop('indent', None)
        sort_keys = kwargs.pop('sort_keys', None)
        if indent:
            kwargs['option'] = orjson.OPT_INDENT_2
        return orjson.dumps(
                item,
                default=json_convertor_default(default_mapping=default_mapping),
                **kwargs).decode(encoding='utf-8')
    else:
        return json.dumps(
            item,
            default=json_convertor_default(default_mapping=default_mapping),
            **kwargs)

The fix would seem to be to handle all of the supported kwargs and translate them to their respective orjson opt. I.e. add in the following lines:


        if sort_keys:
            kwargs['sort_keys'] = orjson.OPT_SORT_KEYS
        ... etc

To Reproduce

NOTE: Need the orjson import to be defined (I'm not sure what allows this to happen, but the bug is hidden behind the if orjson: conditional

Otherwise can just do the following:

diff = deepdiff.DeepDiff(dict1, dict2)
if diff:
    diff.to_json(indent=4, sort_keys=True)

Expected behavior

diff.to_json() should not choke on standard json.dumps() kwargs (e.g. sort_keys)

OS, DeepDiff version and Python version (please complete the following information):

droneshire commented 2 weeks ago

My hack workaround in meantime:

diff_json = diff.to_json()
diff_json_sorted = json.dumps(json.loads(diff_json), indent=4, sort_keys=True)