Python class bytes to json

Python class bytes to json

Last updated: Jan 30, 2023
Reading time · 3 min

banner

# 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>)

type error object of type bytes is not json serializable

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)) # 👉️

remove call to encode method

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)) # 👉️

create custom bytes encoder class

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.

Источник

Читайте также:  Add Map
Оцените статью