翼度科技»论坛 编程开发 python 查看内容

Python-Json异常:Object of type Decimal is not JSON serializable

6

主题

6

帖子

18

积分

新手上路

Rank: 1

积分
18
源起:

使用python分离出一串文本,因为是看起来像整数,结果json转换时发生异常:TypeError: Object of type Decimal is not JSON serializable
  1. msgInfo={"uid":3232324232}
  2. json.dumps(msgInfo, ensure_ascii=False)
复制代码
原因:

decimal格式不能被json.dumps正确处理。json.dumps函数发现字典里面有 Decimal类型的数据,无法JSON serializable
同样的问题也会出现在转换bytes数据时。
解决办法:

解决方法:是检查到Decimal类型的值转化成float类型
对于bytes则需要做一层编码。
正好为了防止中文出错,每次解析加ensure_ascii挺麻烦的。如果不加ensure_ascii,很多时候中文会被转译为:"\u4e2d\u56fd"这样的格式。
原因在于python序列化时对中文默认使用的ascii编码.想输出真正的中文需要指定ensure_ascii=False。
顺手封装为一个公共函数。方便使用。
顺手把时间 转换和bytes处理也一并加上。
后面直接使用toJson(data)就可以。
  1. def toJson(data, indent=None):
  2.     """
  3.     数据转换为Json。
  4.     :param data:
  5.     :param indent:
  6.     :return:
  7.     """
  8.     return json.dumps(data, cls=CustomJsonEncoder, ensure_ascii=False, indent=indent)
  9. class CustomJsonEncoder(json.JSONEncoder):
  10.     """
  11.     Json解析器,解决识别Decimal出错的问题
  12.     """
  13.     def default(self, obj):
  14.         if isinstance(obj, datetime.datetime):
  15.             return obj.strftime("%Y-%m-%d %H:%M:%S")
  16.         if isinstance(obj, bytes):
  17.             return str(obj, encoding='utf-8')
  18.         if isinstance(obj, int):
  19.             return int(obj)
  20.         elif isinstance(obj, float):
  21.             return float(obj)
  22.         elif isinstance(obj, decimal.Decimal):
  23.             return float(obj)
  24.         # elif isinstance(obj, array):
  25.         #    return obj.tolist()
  26.         else:
  27.             return super(CustomJsonEncoder, self).default(obj)
复制代码
同open读文件一样,python对很多问题貌似并不太符合我们的中文习惯。每次都需要加上encoding='utf-8'不然常常会读中文内容时出现问题。
本文由博客一文多发平台 OpenWrite 发布!

来源:https://www.cnblogs.com/kylexy/p/17779599.html
免责声明:由于采集信息均来自互联网,如果侵犯了您的权益,请联系我们【E-Mail:cb@itdo.tech】 我们会及时删除侵权内容,谢谢合作!

举报 回复 使用道具