2012-02-08 18 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' } 

Ho un oggetto JSON con il campo "datetime" come sopra. È perfetto. Ma quando ho stringa i che (voglio conservarlo in cache), ottengo questo formato:Perché JSON.stringify rovina il mio oggetto datetime?

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

Questo provoca problemi, perché quando voglio JSON.parse questo, improvvisamente non è più datetime formato ed è incompatibile con il mio altro formato.

Cosa posso fare per risolvere questo problema? Ho 'created_at' disseminato ovunque nella mia applicazione. Non voglio cambiarli manualmente ciascuno.

+0

Presumibilmente stai serializzando queste date per memorizzarle in localStorage. In tal caso, puoi evitare aggro come questo e simili usando una libreria di wrapper come rhaboo. –

risposta

13

Non c'è un modo speciale per serializzare gli oggetti Date in JSON. Ecco perché ottieni la rappresentazione della stringa standardizzata. È necessario convertirli nuovamente in oggetti Date passandoli al costruttore Date.

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

Aggiornamento: Con la funzione reviver (vedi commenti), è possibile ottenere i Date oggetti indietro.

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

Quindi non c'è niente che posso fare al riguardo? – TIMEX

+0

No, non la penso così. Dovresti conservarlo in un altro modo. –

+0

L'oggetto 'Date' è nativo di JavaScript, ma JSON è un meccanismo di serializzazione utilizzato per il trasporto di dati tra piattaforme. Se consentisse la serializzazione di oggetti e funzioni native, i sistemi che trasmettono JSON da JS a, ad esempio, PHP si interromperanno. Potresti voler esaminare le metodologie JSON 'reviver'. – JAAulde

10

In realtà è possibile modificare il modo in cui un oggetto Date verrà serializzato in JSON. In combinazione con la funzione reviver, è possibile creare una soluzione bidirezionale che funzionerà automaticamente sulla serializzazione e può essere facilmente utilizzata per la deserializzazione.

prima modificare la serializzazione in questo modo:

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

Questo cambierà la rappresentazione di un oggetto Date in un timestamp UNIX con un prefisso come marcatore:

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

Quindi è possibile creare un funzione reviver che filtrerà automaticamente questi valori:

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; 
} 

(Credito : Questo codice è stato praticamente copiato da questa risposta in una questione connessa: https://stackoverflow.com/a/14509447/2572897)

Ora, con questa configurazione, la deserializzazione del nostro risultato da prima si tradurrà in un oggetto Date ancora:

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

Oppure si può scegliere non modificare la serializzazione, ma invece di utilizzare l'espressione regolare per catturare il formato di serializzazione di serie:

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; 
} 

Esempio:

> 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'); }

È possibile leggere ulteriori informazioni sulla documentazione del momento e il tipo di data su misura che si desidera restituire.

Problemi correlati