2016-03-08 27 views
7

Tôi có một lớp bằng Python để lấy tất cả các cột trong một bảng và trả về một JSON với dữ liệu này.datetime.datetime không phải là JSON serializable

Vấn đề là ít nhất một trong số các cột đó là datetime và tôi dường như không hiểu cách tuần tự hóa các cột để tôi có thể tạo JSON hợp lệ.

lớp của tôi là như sau:

class GetTodos(Resource): 
    def get(self): 
     con = cx_Oracle.connect('brunojs/[email protected]/orcl') 
     cur = con.cursor() 
     cur.execute("select * from organite_repository") 
     r = [dict((cur.description[i][0], value) \ 
       for i, value in enumerate(row)) for row in cur.fetchall()] 
     cur.connection.close() 
     return (r[0] if r else None) if None else r 

Bất kỳ gợi ý về vấn đề này?

Trả lời

19

JSON không có loại ngày giờ mặc định, vì vậy đây là lý do tại sao Python không thể xử lý tự động. Vì vậy, bạn cần phải làm cho datetime thành một chuỗi một cách này hay cách khác. Tôi nghĩ cách tốt nhất là viết một trình xử lý tùy chỉnh để giúp mô-đun json.

import datetime 
import json 

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

json.dumps(data, default=datetime_handler) 
+0

Tôi đã cập nhật điều này với 'tăng x' cho trường hợp của tôi. –

+0

Sử dụng 'json.JSONEncoder.default = datetime_handler' để phân tích cú pháp datetime tự động mà không sử dụng' default = datetime_handler' mỗi lần. – ChaimG

+0

Tôi nhận được một TypeError với câu trả lời này, mà nói datetime_handler chấp nhận 1 đối số nhưng JSON đang cố gắng để tay nó 2. – user1917407

3

Cách đơn giản để thực hiện là truyền dữ liệu của bạn thành chuỗi. Bằng cách đó, bạn sẽ có thể đổ bằng json.

>>> datetime.now() 
datetime.datetime(2016, 3, 8, 11, 37, 24, 123639) 

>>> str(datetime.now()) 
'2016-03-08 11:37:27.511053' 

Nhưng, bạn cũng có thể triển khai bộ nối tiếp để chuyển đổi dữ liệu theo ý muốn.

Các vấn đề liên quan