2012-02-08 33 views
8
{ id: 1533, 
    story_type_id: 1, 
    content_id: 470, 
    created_at: Sun, 05 Feb 2012 07:02:43 GMT, 
    updated_at: Sun, 05 Feb 2012 07:02:43 GMT, 
    type_name: 'post' } 

Tôi có đối tượng JSON có trường "datetime" như trên. Thật hoàn hảo. Nhưng khi tôi stringify nó (Tôi muốn để lưu trữ nó trong bộ nhớ cache), tôi nhận được định dạng này:Tại sao JSON.stringify vít lên đối tượng datetime của tôi?

"created_at":"2012-02-05T07:02:43.000Z" 

này gây ra vấn đề, bởi vì khi tôi muốn JSON.parse này, đột nhiên nó không còn datetime định dạng và nó không tương thích với định dạng khác của tôi.

Tôi có thể làm gì để giải quyết vấn đề này? Tôi đã 'created_at' rải rác khắp mọi nơi trong suốt ứng dụng của tôi. Tôi không muốn tự thay đổi từng cái một.

+0

Có lẽ bạn đang sắp xếp các ngày này để lưu trữ chúng trong localStorage. Trong trường hợp đó, bạn có thể tránh aggro như thế này và tương tự bằng cách sử dụng một thư viện wrapper như rhaboo. –

Trả lời

13

Không có cách đặc biệt để tuần tự hóa các đối tượng Date trong JSON. Đó là lý do tại sao bạn nhận được biểu diễn chuỗi tiêu chuẩn hóa. Bạn cần phải chuyển đổi chúng trở lại đối tượng Date bằng cách chuyển chúng đến công cụ xây dựng Date.

item['created_at'] = new Date(item['created_at']); 

Cập nhật: Với reviver chức năng (xem chú thích), bạn có thể lấy Date đối tượng trở lại.

var item = JSON.parse(row, function (key, value) { 
    if (key === 'created_at') { 
    return new Date(value); 
    } else { 
    return value; 
    } 
}); 
+0

Vì vậy, tôi không thể làm gì với nó? – TIMEX

+0

Không, tôi không nghĩ vậy. Bạn sẽ phải lưu trữ nó theo một cách khác. –

+0

Đối tượng 'Date' có nguồn gốc JavaScript, nhưng JSON là một cơ chế tuần tự hóa được sử dụng để truyền dữ liệu giữa các nền tảng. Nếu nó cho phép tuần tự hóa các đối tượng và các hàm gốc, các hệ thống truyền JSON từ JS đến, nói, PHP sẽ phá vỡ. Bạn có thể muốn xem xét các phương thức 'reviver' của JSON. – JAAulde

10

Thực tế có thể sửa đổi cách đối tượng Ngày sẽ được tuần tự hóa thành JSON. Kết hợp với chức năng hồi sinh, một giải pháp hai hướng có thể được tạo ra sẽ tự động làm việc trên serialization và có thể dễ dàng được sử dụng trên deserialization.

Đầu tiên thay đổi tuần tự như thế này:

Date.prototype.toJSON = function() { return "{timestamp}+" . this.getTime() } 

này sẽ thay đổi đại diện của một đối tượng Date thành một dấu thời gian UNIX với một tiền tố là một dấu hiệu:

> json = JSON.stringify({test:new Date()}); 
"{"test":"{timestamp}1380164268633"}" 

Sau đó, bạn có thể tạo một chức năng khôi phục sẽ tự động lọc ra các giá trị sau:

function json_deserialize_helper(key,value) { 
    if (typeof value === 'string') { 
    var regexp; 
    regexp = /^{timestamp}(\d*)$/.exec(value); 
    if (regexp) { 
     return new Date(+regexp[1]); 
    } 
    } 
    return value; 
} 

(Tín dụng : Mã này đã được cơ bản sao chép từ câu trả lời này trong một câu hỏi liên quan: https://stackoverflow.com/a/14509447/2572897)

Bây giờ với thiết lập này, deserialization kết quả của chúng tôi từ trước sẽ cho kết quả trong một đối tượng ngày một lần nữa:

> JSON.parse(json, json_deserialize_helper); 
Object {test: Thu Sep 26 2013 04:57:48 GMT+0200 (CEST)} 

Hoặc bạn có thể chọn không điều chỉnh serialization nhưng thay vì sử dụng regexp để bắt các định dạng serialization tiêu chuẩn:

function json_deserialize_helper(key,value) { 
    if (typeof value === 'string') { 
    var regexp; 
    regexp = /^\d\d\d\d-\d\d-\d\dT\d\d:\d\d:\d\d.\d\d\dZ$/.exec(value); 
    if (regexp) { 
     return new Date(value); 
    } 
    } 
    return value; 
} 

Ví dụ:

> json = JSON.stringify({test:new Date()}) 
"{"test":"2013-09-26T03:05:26.563Z"}" 
> JSON.parse(json, json_deserialize_helper) 
Object {test: Thu Sep 26 2013 05:05:26 GMT+0200 (CEST)} 
0

Date.prototype.toJSON = function() {return moment (this) .format ('L'); }

Bạn có thể đọc thêm về tài liệu thời điểm và loại thiết kế ngày bạn muốn quay lại.

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