英文:
"TypeError: Object of type int64 is not JSON serializable" while trying to convert a nested dict to JSON
问题
这是您要翻译的内容的翻译部分:
我有一个嵌套字典,我试图使用`json.dumps(unserialized_data), indent=2)`将其转换为JSON。该字典当前如下所示:
{
"status": "SUCCESS",
"data": {
"cal": [
{
"year": 2022,
"month": 8,
"a": [
{
"a_id": 1,
"b": [
{
"abc_id": 1,
"val": 2342
}
]
}
]
},
{
"year": 2022,
"month": 9,
"a": [
{
"a_id": 2,
"b": [
{
"abc_id": 3,
"val": 2342
}
]
}
]
}
]
}
}
如何将所有int64
类型的整数转换为int
,同时保持字典的结构和其他数据类型的值不受影响?
英文:
I have a nested dictionary that I am trying to convert to JSON using json.dumps(unserialized_data), indent=2)
. The dictionary currently looks like this:
{
"status": "SUCCESS",
"data": {
"cal": [
{
"year": 2022,
"month": 8,
"a": [
{
"a_id": 1,
"b": [
{
"abc_id": 1,
"val": 2342
}
]
}
]
},
{
"year": 2022,
"month": 9,
"a": [
{
"a_id": 2,
"b": [
{
"abc_id": 3,
"val": 2342
}
]
}
]
}
]
}
}
How can I convert all integers of type int64
to int
while leaving the structure of the dict and values of any other data type unaffected?
答案1
得分: 3
如果您的字典中唯一无法进行JSON序列化的对象都是类型为int64
,您可以通过将int
作为默认函数来将它们轻松序列化,以便JSON无法序列化的对象:
json.dumps(unserialized_data, indent=2, default=int)
英文:
If the only objects in your dict that aren't JSON-serializable are all of type int64
, you can easily serialize them by making int
the default function for converting objects that JSON can't serialize:
json.dumps(unserialized_data, indent=2, default=int)
答案2
得分: 1
如果blhsing的条件不适用,您可以递归地将字典中的任何np.int64
转换为int
:
def cast_type(container, from_types, to_types):
if isinstance(container, dict):
# 转换字典中的所有内容
return {cast_type(k, from_types, to_types): cast_type(v, from_types, to_types) for k, v in container.items()}
elif isinstance(container, list):
# 转换列表中的所有内容
return [cast_type(item, from_types, to_types) for item in container]
else:
for f, t in zip(from_types, to_types):
# 如果项目属于from_types中提到的类型之一,
# 则将其转换为相应的to_types类
if isinstance(container, f):
return t(container)
# 除此以外,不进行转换返回
return container
from_types
和to_types
是容器,其中相应的元素提供要从哪种类型转换以及要转换为哪种类型。将您的字典通过此函数运行,然后将其转储为JSON:
import numpy as np
import json
d = {
"str_data": "foo bar",
"lst": [ np.int64(1000), np.float64(1.234) ],
"dct": {"foo": "bar", "baz": np.float64(6.789), "boo": np.int64(10)}
}
print(json.dumps(d, indent=2)) # 报错
print(json.dumps(
cast_type(d,
[np.int64, np.float64],
[int, float]),
indent=2))
以JSON格式打印字典:
{
"str_data": "foo bar",
"lst": [
1000,
1.234
],
"dct": {
"foo": "bar",
"baz": 6.789,
"boo": 10
}
}
英文:
If blhsing's condition doesn't apply, you can drill down recursively into the dictionary and cast any np.int64
to int
:
def cast_type(container, from_types, to_types):
if isinstance(container, dict):
# cast all contents of dictionary
return {cast_type(k, from_types, to_types): cast_type(v, from_types, to_types) for k, v in container.items()}
elif isinstance(container, list):
# cast all contents of list
return [cast_type(item, from_types, to_types) for item in container]
else:
for f, t in zip(from_types, to_types):
# if item is of a type mentioned in from_types,
# cast it to the corresponding to_types class
if isinstance(container, f):
return t(container)
# None of the above, return without casting
return container
from_types
and to_types
are containers where corresponding elements give the type to convert from, and the type to convert to.
Run your dictionary through this function, then dump it to json:
import numpy as np
import json
d = {
"str_data": "foo bar",
"lst": [ np.int64(1000), np.float64(1.234) ],
"dct": {"foo": "bar", "baz": np.float64(6.789), "boo": np.int64(10)}
}
print(json.dumps(d, indent=2)) # throws error
print(json.dumps(
cast_type(d,
[np.int64, np.float64],
[int, float]),
indent=2))
Prints the dictionary as JSON:
{
"str_data": "foo bar",
"lst": [
1000,
1.234
],
"dct": {
"foo": "bar",
"baz": 6.789,
"boo": 10
}
}
通过集体智慧和协作来改善编程学习和解决问题的方式。致力于成为全球开发者共同参与的知识库,让每个人都能够通过互相帮助和分享经验来进步。
评论