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)
<ipython-input-2-872fdacfda50> in <module>()
----> 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()
This commit is contained in:
Bruno Rocha 2016-10-11 12:31:53 -03:00 committed by Toshio Kuratomi
parent 20aedf90e7
commit b06fb2022c

View file

@ -67,7 +67,7 @@ class AnsibleJSONEncoder(json.JSONEncoder):
if isinstance(o, HostVars): if isinstance(o, HostVars):
return dict(o) return dict(o)
else: else:
return json.JSONEncoder.default(o) return super(AnsibleJSONEncoder, self).default(o)
def to_yaml(a, *args, **kw): def to_yaml(a, *args, **kw):
'''Make verbose, human readable yaml''' '''Make verbose, human readable yaml'''