Pourquoi Javascript utilise-t-il JSON.stringify au lieu de JSON.serialize?

18

Je me demande simplement "stringifier" vs "sérialiser" . Pour moi, c'est la même chose (même si je peux me tromper), mais dans mon expérience passée (principalement avec ), j'utilise Serialize()et je n'utilise jamais Stringify().

Je sais que je peux créer un alias simple en Javascript,

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

// or
JSON.serialize = JSON.stringify;

http://jsfiddle.net/HKKUb/

mais je me demande juste la différence entre les deux et pourquoi stringify a été choisi.


à des fins de comparaison, voici comment sérialiser XML en une chaîne en 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();
}
Chase Florell
la source
7
En fait, tu ne peux pas le faire JSON.serialize = JSON.stringify?
Daniel DiPaolo
pourquoi oui vous pouvez.
Chase Florell
1
Je suppose qu'après avoir relu ma question, je vois que dans mon exemple C #, je sérialise le XML et PUIS convertis l'objet sérialisé ToString();. Là se mêle le hic.
Chase Florell
Je suppose que pour la continuité, il serait préférable (pour moi) d'avoir une méthode qui ressemble à ceci ... JSON.serialize(obj).toString();ou jsonObject().toString();... de cette façon, cela ressemblerait beaucoup à mon C # ... mais maintenant je suis trop compliqué.
Chase Florell

Réponses:

12

Examinez de plus près les deux commentaires que vous avez mis sur la question:

Je suppose qu'après avoir relu ma question, je vois que dans mon exemple C #, je sérialise le XML et PUIS convertis l'objet sérialisé ToString () ;. Là se mêle le hic.

et

Je suppose que pour la continuité, il serait préférable (pour moi) d'avoir une méthode qui ressemble à ceci ... JSON.serialize (obj) .toString (); ou jsonObject (). toString (); ... de cette façon, cela ressemblerait beaucoup à mon C # ... mais maintenant je suis trop compliqué.

Souvenez-vous maintenant qu'en Javascript, un objet est un hachage (plutôt, si vous utilisez Prototype ou un autre framework, il devrait être qualifié de "type spécial de hachage" - mais le formulaire simple fonctionne pour cet exemple):

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

La seule raison pour laquelle un serialize()code pourrait être nécessaire en Javascript est de supprimer les fonctions, les références à d'autres objets, etc.

Donc, pour revenir à votre exemple C # - nous venons de couper .Serialize()comme inutile. Un objet est un hachage, il est déjà sérialisé, une "sérialisation" supplémentaire devrait de toute façon être effectuée manuellement dans votre propre code. Tout ce qui vous laisse est .ToString().

Est- .stringify()ce plus logique maintenant?

Izkata
la source
oui, stringify a du sens, mais je préfère toujours utiliser.toString()
Chase Florell
7
toString pourrait signifier n'importe quoi. JSON.stringify est clairement JSON.
Brandon
11

Cela est dû au fait que la notation JSON a été spécifiée en 1999 et non après 2002 ( asp.netest publiée cette année-là). donc je suppose qu'ils ne connaissaient pas le serialize.

Blagues à part,

En entendant le mot serialization, la première chose qui me vient à l'esprit est comme la conversion des données en octets, ici JSON.stringify est parfaitement logique car il convertit l'objet en une représentation de chaîne et non une représentation d'octet.

PS:

@Chase Florell, vous ne pouvez pas simplement ajouter JSON.serialize, car en mode strict, ce code peut en fait échouer dans certains navigateurs.

comme ce JSONn'est pas votre objet moyen.

Avinash R
la source
Je suppose que dans mon expérience (limitée), la sérialisation de quelque chose l'a toujours converti en une certaine forme de chaîne pour le stockage de fichiers à plat. Je comprends bien ce que vous dites.
Chase Florell
Je pensais que c'était 2001 .. voir wikipedia . Le nom était probablement une préférence personnelle de Douglas Crockford. 1999 est l'année de la 3ème norme ECMA, sur laquelle JSON est fondée.
Martijn Pieters
1
La sérialisation @ChaseFlorell se réfère littéralement à la transformation d'un objet en mémoire en un format de données contiguë en série afin qu'il puisse être atomiquement contenu, je crois qu'une méthode plus courante de le faire serait la représentation octet par octet, pour l'envoi via des réseaux ou autres.
Jimmy Hoffa
@avinashr, re: your ps: edit ... ce violon ne semble pas échouer. pouvez-vous expliquer comment " JSONn'est pas votre objet moyen"? Je ne suis pas sarcastique, je ne sais pas trop ce que vous voulez dire.
Chase Florell
2
@ChaseFlorell est correct - en ce qui concerne Javascript, JSON est un sous - ensemble d'objets Javascript valides. Voir ma réponse pour un exemple simple: Tout JSON valide est un objet / hachage Javascript valide, mais tous les objets / hachages Javascript ne sont pas des JSON valides. C'est même dans le nom - JSON signifie "JavaScript Object Notation".
Izkata