From b06fb2022c7534620238a7da00ad26018433156c Mon Sep 17 00:00:00 2001 From: Bruno Rocha Date: Tue, 11 Oct 2016 12:31:53 -0300 Subject: [PATCH] Fix unbound method call for JSONEncoder (#17970) * Fix unbound method call for JSONEncoder The way it is currently it will lead to unbound method error ```python In [1]: import json In [2]: json.JSONEncoder.default('object_here') --------------------------------------------------------------------------- TypeError Traceback (most recent call last) in () ----> 1 json.JSONEncoder.default('object_here') TypeError: unbound method default() must be called with JSONEncoder instance as first argument (got str instance instead) ``` But what is really wanted is to let the json module to raise the "is not serializable error" which demands a bounded instance of `JSONEncoder()` ```python In [3]: json.JSONEncoder().default('object_here') --------------------------------------------------------------------------- TypeError: 'object_here' is not JSON serializable ``` BTW: I think it would try to call `.to_json` of object before raising as it is a common pattern. * Calling JSONEncoder bounded `default` method using super() --- lib/ansible/plugins/filter/core.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/ansible/plugins/filter/core.py b/lib/ansible/plugins/filter/core.py index 79b6c22d787..3df69fd8286 100644 --- a/lib/ansible/plugins/filter/core.py +++ b/lib/ansible/plugins/filter/core.py @@ -67,7 +67,7 @@ class AnsibleJSONEncoder(json.JSONEncoder): if isinstance(o, HostVars): return dict(o) else: - return json.JSONEncoder.default(o) + return super(AnsibleJSONEncoder, self).default(o) def to_yaml(a, *args, **kw): '''Make verbose, human readable yaml'''