Python class bytes to json
Last updated: Jan 30, 2023
Reading time · 3 min
# TypeError: Object of type bytes is not JSON serializable
The Python «TypeError: Object of type bytes is not JSON serializable» occurs when we try to convert a bytes object to a JSON string.
To solve the error, call the decode() method on the bytes object to decode the bytes to a string before serializing to JSON.
Here is an example of how the error occurs.
Copied!import json my_bytes = 'bobbyhadz.com'.encode('utf-8') # ⛔️ TypeError: Object of type bytes is not JSON serializable json_str = json.dumps('message': my_bytes>)
We tried passing a bytes object to the json.dumps() method but the method doesn’t handle bytes objects by default.
# Remove the call to encode to solve the error
To solve the error, either remove the call to the encode() method or use the decode() method to decode the bytes object to a string.
Copied!import json my_bytes = 'bobbyhadz.com'.encode('utf-8') # ✅ decode bytes object json_str = json.dumps('message': my_bytes.decode('utf-8')>) print(json_str) # 👉️ '' print(type(json_str)) # 👉️
The default JSON encoder handles str values, so we can decode the bytes object to a string before serializing to JSON.
The json.dumps method converts a Python object to a JSON formatted string.
The str.encode method returns an encoded version of the string as a bytes object. The default encoding is utf-8 .
The bytes.decode method returns a string decoded from the given bytes. The default encoding is utf-8 .
# Create a custom BytesEncoder class to solve the error
Alternatively, you can extend from the JSONEncoder class and handle the conversions in a default method.
Copied!import json class BytesEncoder(json.JSONEncoder): def default(self, obj): if isinstance(obj, bytes): return obj.decode('utf-8') return json.JSONEncoder.default(self, obj) my_bytes = 'hello world'.encode('utf-8') json_str = json.dumps('message': my_bytes>, cls=BytesEncoder) print(json_str) # 👉️ '' print(type(json_str)) # 👉️
We extended from the JSONEncoder class.
The JSONEncoder class supports the following objects and types by default.
Python | JSON |
---|---|
dict | object |
list, tuple | array |
str | string |
int, float, int and float derived Enums | number |
True | true |
False | false |
None | null |
Notice that the JSONEncoder class doesn’t support bytes to JSON conversion by default.
We can handle this by extending from the class and implementing a default() method that returns a serializable object.
Copied!import json class BytesEncoder(json.JSONEncoder): def default(self, obj): if isinstance(obj, bytes): return obj.decode('utf-8') return json.JSONEncoder.default(self, obj)
If the passed-in value is a bytes object, we decode it to a str and return the result.
The isinstance function returns True if the passed-in object is an instance or a subclass of the passed in class.