¿Por qué Javascript usa JSON.stringify en lugar de JSON.serialize?

18

Me pregunto sobre "stringify" vs "serialize" . Para mí son lo mismo (aunque podría estar equivocado), pero en mi experiencia pasada (principalmente con ) uso Serialize()y nunca uso Stringify().

Sé que puedo crear un alias simple en Javascript,

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

// or
JSON.serialize = JSON.stringify;

http://jsfiddle.net/HKKUb/

pero me pregunto sobre la diferencia entre los dos y por qué se eligió stringify.


para fines de comparación, así es como serializa XML a una cadena 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
fuente
77
En realidad no puedes simplemente hacer JSON.serialize = JSON.stringify?
Daniel DiPaolo
porque si puedes.
Chase Florell
1
Supongo que después de volver a leer mi pregunta, veo que en mi ejemplo de C #, estoy serializando el XML y ENTONCES convirtiendo el objeto serializado ToString();. Ahí está el roce.
Chase Florell
Supongo que para la continuidad, sería mejor (para mí) tener un método que se vea así ... JSON.serialize(obj).toString();o jsonObject().toString();... de esta manera se parecería mucho a mi C # ... pero ahora lo estoy complicando.
Chase Florell

Respuestas:

12

Eche un vistazo más de cerca a los dos comentarios que ha puesto sobre la pregunta:

Supongo que después de volver a leer mi pregunta, veo que en mi ejemplo de C #, estoy serializando el XML y ENTONCES convirtiendo el objeto serializado ToString () ;. Ahí está el roce.

y

Supongo que para la continuidad, sería mejor (para mí) tener un método que se vea así ... JSON.serialize (obj) .toString (); o jsonObject (). toString (); ... de esta manera se parecería mucho a mi C # ... pero ahora estoy más complicada.

Ahora recuerde que en Javascript, un objeto es un hash (más bien, si usa Prototype u otro marco, debe calificarse como un "tipo especial de hash", pero la forma simple funciona para este ejemplo):

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 única razón por la que serialize()puede ser necesario en Javascript es para cortar las funciones, referencias a otros objetos, etc.

Entonces, para volver a su ejemplo de C #, acabamos de eliminarlo .Serialize()como innecesario. Un objeto es un hash, ya está serializado, de todos modos la "serialización" adicional debería realizarse manualmente en su propio código. Todo lo que te deja es .ToString().

¿Tiene .stringify()más sentido ahora?

Izkata
fuente
sí, stringify tiene sentido, sin embargo, prefiero usarlo.toString()
Chase Florell
77
toString podría significar cualquier cosa. JSON.stringify es claramente JSON.
Brandon
11

Esto se debe a que la notación JSON se especificó en 1999, no después de 2002 ( asp.netse lanzó en ese año). así que supongo que no sabían sobre el serialize.

Bromas aparte,

Al escuchar la palabra serialization, lo primero que me viene a la mente es como convertir los datos a bytes, aquí JSON.stringify tiene mucho sentido ya que convierte el objeto en una representación de cadena, no en una representación de bytes.

PD:

@Chase Florell, no puede simplemente agregar JSON.serialize, ya que en modo estricto, este código puede fallar en algunos navegadores.

como JSONno es tu objeto promedio.

Avinash R
fuente
Supongo que en mi experiencia (limitada), la serialización de algo siempre ha sido convertirla en alguna forma de cadena para el almacenamiento de archivos planos. Aunque entiendo lo que estás diciendo.
Chase Florell
Pensé que era 2001 ... ver wikipedia . El nombre era probablemente una preferencia personal de Douglas Crockford. 1999 es el año en que salió el tercer estándar ECMA, en el que se funda JSON.
Martijn Pieters
1
La serialización de @ChaseFlorell literalmente se refiere a convertir un objeto en memoria en un formato de datos contiguos en serie para que pueda estar contenido atómicamente, creo que un método más común de hacerlo sería la representación bytewise, para enviar a través de redes u otros.
Jimmy Hoffa
@avinashr, re: your ps: edit ... este violín no parece fallar. ¿Puedes explicar cómo " JSONno es tu Objeto promedio"? No estoy siendo sarcástico, solo no estoy claro a qué te refieres.
Chase Florell
2
@ChaseFlorell es correcto: con respecto a Javascript, JSON es un subconjunto de objetos Javascript válidos. Vea mi respuesta para un ejemplo simple: todo JSON válido es un objeto / hash Javascript válido, pero no todos los objetos / hash Javascript son JSON válidos. Incluso está en el nombre: JSON significa "JavaScript Object Notation".
Izkata