Python 3: TypeError: Object of type ‘dict_values‘ is not JSON serializable

 python2.7

>>>json.dumps(x.values())
'[{"name": "Michael"}, {"name": "Mark"}]'

 不同之处在于values方法返回的结果:

# Python 2.7.10
>>> x.values()
[{'name': 'Michael'}, {'name': 'Mark'}]

# Python 3.6.0
>>> x.values()
dict_values([{'name': 'Mark'}, {'name': 'Michael'}])
>>>

python 3 不再返回数组,而是在数据周围使用dict_values包装器。

我们只需要用对list的调用来包装对values的调用:

>>> json.dumps(list(x.values()))
'[{"name": "Mark"}, {"name": "Michael"}]'

解决方法参考网站https://www.markhneedham.com/blog/2017/03/19/python-3-typeerror-object-type-dict_values-not-json-serializable/

### 解决 mat_struct 对象 JSON 序列化问题 当尝试将 `mat_struct` 对象转换为 JSON 格式时,可能会遇到 TypeError 错误,这是因为默认的 JSON 编码器无法处理自定义对象类型。为了克服这一挑战,可以通过创建一个自定义编码器来实现。 #### 创建自定义 JSONEncoder 类 通过继承 Python 的内置类 `json.JSONEncoder` 并重写其方法 `_default()` 来支持新的数据类型的序列化: ```python import json from scipy.io import loadmat class MatStructEncoder(json.JSONEncoder): def default(self, obj): if isinstance(obj, matlab.struct.mat_struct): return {name: getattr(obj, name) for name in dir(obj) if not name.startswith('_')} # 让其他类型的对象继续使用默认的行为 return super().default(obj) ``` 此代码片段中定义了一个名为 `MatStructEncoder` 的新类[^1]。该类能够识别并适当地转换来自 MATLAB 文件中的结构体成员到字典形式,从而使得这些复杂的数据结构可以被顺利地转成 JSON 文本表示。 #### 使用自定义编码器进行序列化操作 一旦有了上述定制化的编码工具之后,在调用 `json.dumps()` 方法的时候就可以指定参数 `cls=MatStructEncoder` ,这样就能让整个过程变得简单明了: ```python data = loadmat('example.mat') # 加载 .mat 文件 struct_data = data['variable_name'] # 获取特定变量名下的 mat_struct 数据 # 将 mat_struct 转换成 JSON 字符串 json_str = json.dumps(struct_data, cls=MatStructEncoder) print(json_str) ``` 这种方法不仅解决了原始问题——即如何绕过由于不兼容而导致的异常情况;同时也提供了一种通用解决方案,适用于任何想要把类似结构的对象转化为易于传输或存储的形式的应用场景。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值