Por que o Javascript usa JSON.stringify em vez de JSON.serialize?


18

Eu só estou querendo saber sobre "stringify" vs "serializar" . Para mim, eles são a mesma coisa (embora eu possa estar errado), mas na minha experiência passada (principalmente com ) eu uso Serialize()e nunca uso Stringify().

Eu sei que posso criar um alias simples em Javascript,

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

// or
JSON.serialize = JSON.stringify;

http://jsfiddle.net/HKKUb/

mas estou me perguntando sobre a diferença entre os dois e por que o stringify foi escolhido.


para fins de comparação, veja como serializar XML para uma String em 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();
}

7
Na verdade você não pode simplesmente fazer JSON.serialize = JSON.stringify?
9788 Daniel DiPaolo #

porque sim você pode.
usar o seguinte comando

1
Suponho que, depois de reler minha pergunta, estou vendo que, no meu exemplo de C #, estou serializando o XML e convertendo o objeto serializado ToString();. Lá inlies o atrito.
Chase Florell

Eu acho que, para continuidade, seria melhor (para mim) ter um método que se parecesse com isso ... JSON.serialize(obj).toString();ou jsonObject().toString();... dessa forma, parecesse muito com o meu C # ... mas agora eu estou complicando demais.
Chase Florell

Respostas:


12

Dê uma olhada nos dois comentários que você colocou na pergunta:

Suponho que, depois de reler minha pergunta, estou vendo que, no meu exemplo de C #, estou serializando o XML e convertendo o objeto serializado ToString () ;. Lá inlies o atrito.

e

Eu acho que, para continuidade, seria melhor (para mim) ter um método parecido com este ... JSON.serialize (obj) .toString (); ou jsonObject (). toString (); ... dessa forma, seria parecido com o meu C # ... mas agora estou mais complicado.

Agora, lembre-se de que, em Javascript, um objeto é um hash (em vez disso, se estiver usando Prototype ou outra estrutura, ele deve ser qualificado como um "tipo especial de hash" - mas o formulário simples funciona neste exemplo):

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

O único motivo pelo qual um serialize()Javascript pode ser necessário é cortar as funções, referências a outros objetos etc.

Então, voltando ao seu exemplo de C # - acabamos de .Serialize()considerar desnecessários. Um objeto é um hash, ele já está serializado, "serialização" adicional teria que ser feita manualmente em seu próprio código. Tudo o que você deixa é .ToString().

Faz .stringify()mais sentido agora?


sim, stringify faz sentido, no entanto eu ainda prefiro usar.toString()
Perseguição Florell

7
toString pode significar qualquer coisa. JSON.stringify é claramente JSON.
Brandon

11

Isso ocorre porque a notação JSON foi especificada em 1999 e não após 2002 ( asp.neté lançada naquele ano). então eu acho que eles não sabiam sobre o serialize.

Piadas a parte,

Ao ouvir a palavra serialization, a primeira coisa que me vem à mente é como converter os dados em bytes, aqui o JSON.stringify faz todo o sentido, pois converte o objeto em uma representação de cadeia e não em byte.

PS:

@Chase Florell, você não pode simplesmente adicionar JSON.serialize, como no modo estrito, esse código pode realmente falhar em alguns navegadores.

como JSONnão é seu objeto comum.


Eu acho que na minha experiência (limitada), serializar algo sempre foi convertê-lo em algum tipo de string para armazenamento de arquivos simples. Eu entendo o que você está dizendo.
Chase Florell

Eu pensei que era 2001 .. veja a Wikipedia . O nome provavelmente era uma preferência pessoal de Douglas Crockford. 1999 é o ano em que o terceiro padrão ECMA foi lançado, no qual o JSON se baseia.
Martijn Pieters

1
A serialização do @ChaseFlorell se refere literalmente a transformar um objeto na memória em um formato de dados serialmente contíguo, para que ele possa ser contido atomicamente. Acredito que um método mais comum de fazer isso seria a representação bytewise, para enviar através de redes ou outro tipo.
Jimmy Hoffa

@avinashr, re: your ps: edit ... esse violino não parece falhar. você pode explicar como " JSONnão é seu objeto comum"? Não estou sendo sarcástico, apenas não entendo o que você quer dizer.
Chase Florell

2
@ChaseFlorell está correto - em relação ao Javascript, o JSON é um subconjunto de objetos Javascript válidos. Veja minha resposta para um exemplo simples: Todo JSON válido é um objeto / hash Javascript válido, mas nem todos os objetos / hashes Javascript são JSON válidos. Está até no nome - JSON significa "JavaScript Object Notation".
Izkata 7/09/12
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.