How to make a class JSON serializable
json, python, serialization
Solution
Do you have an idea about the expected output? For example, will this do?
>>> f = FileItem("/foo/bar")
>>> magic(f)
'{"fname": "/foo/bar"}'
In that case you can merely call `json.dumps(f.__dict__)`.
If you want more customized output then you will have to subclass `JSONEncoder` and implement your own custom serialization.
For a trivial example, see below.
>>> from json import JSONEncoder
>>> class MyEncoder(JSONEncoder):
def default(self, o):
return o.__dict__
>>> MyEncoder().encode(f)
'{"fname": "/foo/bar"}'
Then you pass this class into the `json.dumps()` method as `cls` kwarg:
json.dumps(cls=MyEncoder)
If you also want to decode then you'll have to supply a custom `object_hook` to the `JSONDecoder` class. For example:
>>> def from_json(json_object):
if 'fname' in json_object:
return FileItem(json_object['fname'])
>>> f = JSONDecoder(object_hook = from_json).decode('{"fname": "/foo/bar"}')
>>> f
<__main__.FileItem object at 0x9337fac>
>>>
Problem
How to make a Python class serializable? ``` class FileItem: def __init__(self, fname): self.fname = fname ``` Attempt to serialize to JSON: ``` >>> import json >>> x = FileItem('/foo/bar') >>> json.dumps(x) TypeError: Object of type 'FileItem' is not JSON serializable ```
Related problems
- Making object JSON serializable with regular encoder
- Easiest way to serialize a simple class object with simplejson?
- How to convert JSON data into a Python object?
- Serializing output to JSON - ValueError: Circular reference detected
- Encoding nested python object in JSON
- How to create a class instance without calling initializer?