1. 程式人生 > >Python的json不能序列化datetime型別資料問題

Python的json不能序列化datetime型別資料問題

Python自帶的json.dumps方法序列化資料時候如果格式化的資料中有datetime型別資料時候會提示錯誤

TypeError: datetime.datetime(2012, 12, 12, 15, 47, 15) is not JSON serializable

import datetime
import json

def datetime_handler(x):
    if isinstance(x, datetime.datetime):
        return x.isoformat()
    raise TypeError("Unknown type"
)

搜尋出來的解決方案基本都是用Django的DjangoJSONEncoder來解決,為了一個簡單的辦法引入Django這個大傢伙實在有點不知所謂。不過這一點就體現了Django的資料多的優勢了

正在下決心是否乾脆下載了Django的程式碼去翻出DjangoJSONEncoder這個方法來的時候看到了官方文件中關於json.dumps方法的一個引數(cls)說明:

To use a custom JSONEncoder subclass (e.g. one that overrides the default() method to serialize additional types), specify it with the cls kwarg; otherwise JSONEncoder is used.

然後就看到了官方文件中的一個Demo:

>>> import json
>>> class ComplexEncoder(json.JSONEncoder):
...     def default(self, obj):
...         if isinstance(obj, complex):
...             return [obj.real, obj.imag]
...         return json.JSONEncoder.default(self, obj)
...
>>> dumps(2
+ 1j, cls=ComplexEncoder) '[2.0, 1.0]' >>> ComplexEncoder().encode(2 + 1j) '[2.0, 1.0]' >>> list(ComplexEncoder().iterencode(2 + 1j)) ['[', '2.0', ', ', '1.0', ']']

然後簡單擴充套件了一個JSONEncoder出來用來格式化時間

class CJsonEncoder(json.JSONEncoder):
    def default(self, obj):
        if isinstance(obj, datetime):
            return obj.strftime('%Y-%m-%d %H:%M:%S')
        elif isinstance(obj, date):
            return obj.strftime('%Y-%m-%d')
        else:
            return json.JSONEncoder.default(self, obj)

使用時候只要在json.dumps增加一個cls引數即可:

json.dumps(datalist, cls=CJsonEncoder)

相關推薦

Python的json不能序列datetime型別資料問題

Python自帶的json.dumps方法序列化資料時候如果格式化的資料中有datetime型別資料時候會提示錯誤 TypeError: datetime.datetime(2012, 12, 12, 15, 47, 15) is not JSON se

python使用json序列datetime型別問題處理

使用python的json模組序列化時間或者其他不支援的型別時會拋異常,例如下面的程式碼: # -*- coding: cp936 -*-from datetime import datetime import json if __name__=='__main__'

JavaScriptSerializer序列化成Json時DateTime型別資料的處理

JavaScriptSerializer在序列化時會將DateTime的資料序列化成類似\/Date(626543800000)\/這樣的值,找了很多方法都不如意,最後在一個部落格找到了完美的解決方法,地址:http://blog.calyptus.eu/seb/20

關於在Django中Json無法序列datetime的解決辦法

ngs spec `` keys 定義 列表 ror 內置 cat      我們在網頁設計時經常會在前端和後臺進行交互,前端回傳的方法可以時redirect一個地址加上顯式的參數,第二個辦法就是使用Ajax結構。那麽在傳到view函數中進行處理後是需要通過Json格式進行

jQuery 序列表單資料 jQuery 序列表單資料 serialize() serializeArray()

【轉自】jQuery 序列化表單資料 serialize() serializeArray() 1.serialize()方法   格式:var data = $("form").serialize();   功能:將表單內容序列化成一個字串。  

thinkphp 模板格式化輸出datetime型別資料

原理 一,PHP時間戳函式獲取指定日期的unix時間戳 strtotime(”2009-1-22″) 示例如下: echo strtotime(”2009-1-22″) 結果:1232553600 說明:返回2009年1月22日0點0分0秒時間戳 二,PHP時間戳函式獲

向資料庫中插入日期時間datetime型別資料,資料庫中只有日期沒有時分秒

  java.util.Date是不能直接插入資料庫中的,雖然它包含了日期和時分秒。   java.sql.Date可以直接插入資料庫,但是它只有日期而沒有時間;   java.sql.Time可以直接插入資料庫,但是它只有時間,沒有日期 Java

JSON序列與反序列匿名型別

一、序列化匿名型別 1.序列化一個var型別 using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Data; using Gon

java json序列日期型別

做介面開發時經常需要給前端返回日期資料,比如生日、建立時間、更新時間等。我們一般是建一個bean,將定義所需要的欄位,並和資料庫的欄位相對應。雖然資料庫的欄位是日期型別的,但bean的欄位定義在String就行了,看下面的測試程式碼: package co

關於使用alibaba的ARouter 序列bean,傳遞資料失敗的問題 解決

最近在專案中使用ARouter 時候遇到了一個困擾了我同事一個星期的bug,同事苦思奇想不得其解,找到了我,自認為這種bug,有那麼困難,於是就自己操作了一遍,發現我也傳值不過去,那怎麼解決了    使用ARouter 遇到的坑程式碼: ARout

Swagger使用GET連結訪問 出現“ObjectContent`1”型別未能序列內容型別“application/xml; charset=utf-8”的響應正文錯誤

找到Swagger的配置檔案,然後在Register中加入 GlobalConfiguration.Configuration.Formatters.XmlFormatter.SupportedMediaTypes.Clear(); 理論上來說就OK了。

jQuery 序列表單資料 serialize() serializeArray()

1.serialize()方法   格式:var data = $("form").serialize();   功能:將表單內容序列化成一個字串。   這樣在ajax提交表單資料時,就不用一一列舉出每一個引數。只需將data引數設定為 $("form").seri

django自定義序列返回處理資料為null情況

在介面返回資料時,如果資料庫表中查詢出來的某些欄位為null時,在前端需要多處理一些資料異常的情況。 django可以自定義序列化返回處理,將返回的內容限制和預處理再返回到前端。 1.未處理時返回 如圖上,有email、mobile這兩個欄位是有可以為空且預設值為null的

C#程式設計向SQLite資料庫中正確寫入DateTime型別資料

最近用C#編寫了一個程式,裡面涉及向SQLite資料庫寫入DateTime型別資料,實際時間為2012/11/30 0:20:00,但寫入資料庫後變成1899/12/30 00:00:00。 實際情況是時間寫入資料庫失敗,1899/12/30 00:00:00是資料

Jackson 自定義序列 & 反序列 物件型別

public class JacksonUtils { private static final ObjectMapper mapper = new ObjectMapper(); public static final String CLASS_KEY

JavaScript:表單序列後的資料轉換成json格式

表單序列化可以比較方便的拿到form表單中的資料,但是序列化後的資料是一段url字串.這邊利用方法轉化成json資料格式: var DataDeal = { //將從form中通過

Gson 反序列Map型別的小問題

import java.sql.Timestamp; import java.text.DateFormat; import java.text.ParseException; import java.text.SimpleDateFormat; import java.u

資料byte形式備份儲存到本地檔案,反序列讀取出資料恢復

前提: 需要備份的資料由介面 object轉換成byte[],備份儲存到本地檔案; 選擇本地檔案,取得資料 byte[]轉換成object,用於資料恢復。 步驟如下: 1.把物件(資料)list ( object ) 序列化並返回相應的位元組byte[] pub

解決Asp.net Mvc返回JsonResult中DateTime型別資料格式的問題

問題背景:            在使用asp.net mvc 結合jquery esayui做一個系統,但是在使用使用this.json方法直接返回一個json物件,在列表中顯示時發現datetime型別的資料在轉為字串是它預設轉為Date(84923838332223)

在Java中對mysql資料庫插入datetime型別資料

最近在做一個簡單的考勤系統的時候碰到了一個弄了我好久的問題,在我往資料庫中更新一條簽到時間的記錄的時候,我獲取的時間是沒有錯的,但是Hibernate往資料庫裡面插入的時候資料的時候,控制檯報了一大堆錯誤,而資料庫裡面也是沒有任何資料被更新的。。這就引發了異常D