源起: 使用python分離出一串文本,因為是看起來像整數,結果json轉換時發生異常:TypeError: Object of type Decimal is not JSON serializable msgInfo={"uid":3232324232} json.dumps(msgInfo, ...
源起:
使用python分離出一串文本,因為是看起來像整數,結果json轉換時發生異常:TypeError: Object of type Decimal is not JSON serializable
msgInfo={"uid":3232324232}
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)就可以。
def toJson(data, indent=None):
"""
數據轉換為Json。
:param data:
:param indent:
:return:
"""
return json.dumps(data, cls=CustomJsonEncoder, ensure_ascii=False, indent=indent)
class CustomJsonEncoder(json.JSONEncoder):
"""
Json解析器,解決識別Decimal出錯的問題
"""
def default(self, obj):
if isinstance(obj, datetime.datetime):
return obj.strftime("%Y-%m-%d %H:%M:%S")
if isinstance(obj, bytes):
return str(obj, encoding='utf-8')
if isinstance(obj, int):
return int(obj)
elif isinstance(obj, float):
return float(obj)
elif isinstance(obj, decimal.Decimal):
return float(obj)
# elif isinstance(obj, array):
# return obj.tolist()
else:
return super(CustomJsonEncoder, self).default(obj)
同open讀文件一樣,python對很多問題貌似並不太符合我們的中文習慣。每次都需要加上encoding='utf-8'不然常常會讀中文內容時出現問題。
本文由博客一文多發平臺 OpenWrite 發佈!