TypeError: Object of type 'float32' is not JSON serializable

Viewed 89921

I'm working with numpy.float32 numbers and they don't go into JSON. What's the right approach to overcome this issue?

import numpy as np
import json

a = np.float32(1)
json.dumps(a)

TypeError: Object of type 'float32' is not JSON serializable
1 Answers

It has to be a string, so you can have:

json.dumps(str(a))

EDIT:

JSON is a format for serialising object data. It doesn't really care or know about Python types, the json package tries to translate whatever object you pass json.dumps() into a string form via a conversion table that only supports some types (see doc below).

This is the reason why I think it's a good idea to just pass a string to avoid this issue: numpy.float32 just isn't in the table.

Because some have commented that explicitly passing a string to dumps "sounds wrong" I'll just add the doc here

json.dumps(obj, *, skipkeys=False, ensure_ascii=True, check_circular=True, allow_nan=True, cls=None, indent=None, separators=None, default=None, sort_keys=False, **kw) Serialize obj to a JSON formatted str using this conversion table. The arguments have the same meaning as in dump().

Note Keys in key/value pairs of JSON are always of the type str. When a dictionary is converted into JSON, all the keys of the dictionary are coerced to strings. As a result of this, if a dictionary is converted into JSON and then back into a dictionary, the dictionary may not equal the original one. That is, loads(dumps(x)) != x if x has non-string keys.

taken from the official docs here: https://docs.python.org/3/library/json.html

Related