Perché Javascript utilizza JSON.stringify invece di JSON.serialize?

18

Mi sto solo chiedendo di "stringify" vs "serialize" . Per me sono la stessa cosa (anche se potrei sbagliarmi), ma nella mia esperienza passata (principalmente con ) Uso Serialize() e non uso mai Stringify() .

So che posso creare un semplice alias in Javascript,

// either
JSON.serialize = function(input) {
    return JSON.stringify(input);
};

// or
JSON.serialize = JSON.stringify;

link

ma mi domando solo la differenza tra i due e perché è stato scelto stringify.

a scopo di confronto, ecco come serializzi XML in una stringa in C #

public static string SerializeObject<T>(this T toSerialize)
{
    XmlSerializer xmlSerializer = new XmlSerializer(toSerialize.GetType());
    StringWriter textWriter = new StringWriter();

    xmlSerializer.Serialize(textWriter, toSerialize);
    return textWriter.ToString();
}
    
posta Chase Florell 07.09.2012 - 17:37
fonte

3 risposte

12

Dai uno sguardo più da vicino ai due commenti che hai inserito nella domanda:

I suppose after re-reading my question, I'm seeing that in my C# example, I'm serializing the XML and THEN converting the serialized object ToString();. There inlies the rub.

e

I guess for continuity, it would be better (for me) to have a method that looks like this... JSON.serialize(obj).toString(); or jsonObject().toString();... this way it would look much like my C#... but now I'm over complicating it.

Ora ricorda che in Javascript, un oggetto è un hash (piuttosto, se si utilizza Prototype o un altro framework, dovrebbe essere qualificato come "tipo speciale di hash" - ma il modulo semplice funziona per questo esempio):

var obj = {
   foo: 1,
   bar: function() { console.log(this.foo); }
}
obj.foo; // 1
obj.bar; // function reference
obj.bar(); // function call
obj['foo']; // 1
obj['bar']; // function reference
obj['bar'](); // function call

L'unica ragione per cui in% Javascript potrebbe essere necessario un serialize() è di ritagliare le funzioni, i riferimenti ad altri oggetti, ecc.

Quindi, per tornare al tuo esempio in C #, abbiamo appena tagliato .Serialize() come non necessario. Un oggetto è un hash, è già serializzato, ulteriori "serializzazioni" dovrebbero essere eseguite manualmente nel proprio codice comunque. Tutto ciò che ti lascia è .ToString() .

.stringify() ha più senso ora?

    
risposta data 07.09.2012 - 20:12
fonte
11

Questo perché la notazione JSON è stata specificata nel 1999 non dopo 2002 ( asp.net è stato rilasciato in quell'anno). quindi suppongo che non conoscessero il serialize .

Battute a parte,

Sentendo la parola serialization , la prima cosa che mi viene in mente è come convertire i dati in byte, qui JSON.stringify ha perfettamente senso poiché converte l'oggetto in una rappresentazione di stringa e non in una rappresentazione di byte.

PS:

@Chase Florell, non puoi semplicemente aggiungere JSON.serialize , come nella modalità rigorosa, questo codice potrebbe non funzionare in alcuni browser.

come JSON non è il tuo oggetto medio.

    
risposta data 07.09.2012 - 17:48
fonte
-2

Serialize significa convertire una rappresentazione di dati non contigui in una rappresentazione di dati contigua. Ad esempio, la conversione di un oggetto grafico che si sviluppa su RAM non contigua in una matrice di byte O una stringa.

Una stringa Json è un modo per serializzare una tale struttura. Una stringa è una matrice di caratteri codificati come byte.

E con quel ... stringify è un nome molto stupido. serialize è un nome migliore.

Ma questo è JavaScript e in JavaScript viene eseguita la cosa più stupida che si possa fare. Questo è il motivo per cui è chiamato stringify e non serialize .

Altrettanto stupidi (e quindi appropriati per JavaScript) i nomi alternativi per stringify potrebbero essere Undeserializify o PutThisDataInOrderify .

Per qualche ragione gli autori delle API hanno rotto la coerenza scegliendo un nome assolutamente appropriato per l'operazione inversa di conversione dei dati di carattere in una rappresentazione di dati in memoria. Questo metodo è chiamato JSON.parse . Anche Deserialize sarebbe stato appropriato. Ma questo è Javascript e in Javascript ciò che è sensato è insensato.

Per rimanere con la barbarie di Javascript, parse avrebbe dovuto essere chiamato Unstringlyify o TearAsunderThatWhichHasBeenJoinedify .

Spero che questo aiuti.

    
risposta data 21.12.2018 - 19:49
fonte

Leggi altre domande sui tag