今天用python写后台时,在向客户端返回数据时,老是报错:
AttributeError: 'bytes' object has no attribute '__dict__'
出错误的地方:
json.dumps(r, ensure_ascii=False, default=lambda o: o.__dict__).encode('utf-8')
其中,json模块中的dumps方法的作用是将json数据转成字符串,r是json对象,ensure_ascii的作用是否以ASCII码显示,default是序列化json对象函数。
然后就一直查找原因,最终找到的原因让人哭笑不得,因为数据中含有二进制数据,所以一直不能转换。
查看json.dumps中的源代码可以发现:
Supports the following objects and types by default: +-------------------+---------------+ | Python | JSON | +===================+===============+ | dict | object | +-------------------+---------------+ | list, tuple | array | +-------------------+---------------+ | str | string | +-------------------+---------------+ | int, float | number | +-------------------+---------------+ | True | true | +-------------------+---------------+ | False | false | +-------------------+---------------+ | None | null | +-------------------+---------------+
不支持二进制数据类型,所以将要返回的数据转换成其他可以作用的类型,就可以了。
好了,展示一下我原来的数据和改进后的数据,红色标注的地方为数据变化的地方:
原数据:
[{'id': '00152265144038712d2a0886a4d4477a5b8013f51022415000', 'username': 'admin', 'password': '0c663e8c12b5e39788d78bf4193550ba7342c789', 'nickname': 'admin', 'email': '12313@qq.com', 'sex': b'\x00', 'phone': '123123', 'token': '432', 'remark': '432', 'avatar': '432', 'create_date': 1522651392.32758, 'update_date': 1522651392.32758}]
改进后的数据:
[{'id': '00152265144038712d2a0886a4d4477a5b8013f51022415000', 'username': 'admin', 'password': '0c663e8c12b5e39788d78bf4193550ba7342c789', 'nickname': 'admin', 'email': '12313@qq.com', 'sex': 0, 'phone': '123123', 'token': '432', 'remark': '432', 'avatar': '432', 'create_date': 1522651392.32758, 'update_date': 1522651392.32758}]