PythonでJSONからnullや空のキーを取り除く

値のないキーはレスポンスに含めないで返してクレメンス。
みたいな仕様を実装したくて調べました。

GitHub Gistにそのまま使えそうなコードを発見。
https://gist.github.com/nlohmann/c899442d8126917946580e7f84bf7ee7
こちらを拝借。

空文字も落としたかったのでちょっと修正して動作確認。
import json

def remove_empty_elements(d):
    def empty(x):
        return x is None or x == {} or x == [] or x == ""

    if not isinstance(d, (dict, list)):
        return d
    elif isinstance(d, list):
        return [v for v in (remove_empty_elements(v) for v in d) if not empty(v)]
    else:
        return {k: v for k, v in ((k, remove_empty_elements(v)) for k, v in d.items()) if not empty(v)}

if __name__ == '__main__':
    foo = {
        "str": "String",
        "empty_str": "",
        "none": None,
        "zero": 0,
        "bool": False,
        "object": {
             "foo": "bar",
             "none": None,
             "empty_str": "",
         },
        "empty_object": {},
        "array": ["foo", "bar", ""],
        "empty_array": [],
        "array_object":[
            {
                "foo": "bar",
                "none": None,
                "empty_str": "",
            },
            {
                "foo": "bar",
                "none": None,
                "empty_str": "",
            },
            {},
        ]
    }

    bar = remove_empty_elements(foo)
    print(json.dumps(bar, indent=4))
>python3 remove_empty_elements.py
{
    "str": "String",
    "zero": 0,
    "bool": false,
    "object": {
        "foo": "bar"
    },
    "array": [
        "foo",
        "bar"
    ],
    "array_object": [
        {
            "foo": "bar"
        },
        {
            "foo": "bar"
        }
    ]
}
期待通りの動きですね。