Dlaczego JavaScript używa JSON.stringify zamiast JSON.serialize?

18

Zastanawiam się tylko nad „stringify” vs „serialize” . Dla mnie są to to samo (chociaż mogę się mylić), ale z mojego przeszłego doświadczenia (głównie z ) używam Serialize()i nigdy nie używam Stringify().

Wiem, że mogę utworzyć prosty alias w JavaScript,

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

// or
JSON.serialize = JSON.stringify;

http://jsfiddle.net/HKKUb/

ale zastanawiam się tylko nad różnicą między nimi i dlaczego wybrano strify.


dla celów porównania, oto jak serializować XML do łańcucha w 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
źródło
7
Właściwie nie możesz tak po prostu zrobić JSON.serialize = JSON.stringify?
Daniel DiPaolo,
dlaczego tak możesz.
Chase Florell,
1
Przypuszczam, że po ponownym przeczytaniu mojego pytania widzę, że w moim przykładzie C # serializuję XML, a następnie konwertujesz serializowany obiekt ToString();. Tam jest pocieranie.
Chase Florell,
Chyba dla ciągłości, lepiej (dla mnie) byłoby mieć metodę, która wygląda tak ... JSON.serialize(obj).toString();lub jsonObject().toString();... w ten sposób wyglądałaby podobnie do mojego C # ... ale teraz to komplikuję.
Chase Florell,

Odpowiedzi:

12

Przyjrzyj się bliżej dwóm komentarzom, które postawiłeś na pytanie:

Przypuszczam, że po ponownym przeczytaniu mojego pytania widzę, że w moim przykładzie w C # serializuję XML, a następnie konwertujesz serializowany obiekt ToString () ;. Tam jest pocieranie.

i

Myślę, że dla ciągłości lepiej (dla mnie) byłoby mieć metodę, która wygląda następująco ... JSON.serialize (obj) .toString (); lub jsonObject (). toString (); ... w ten sposób wyglądałoby to bardzo podobnie do mojego C # ... ale teraz to komplikuję.

Teraz pamiętaj, że w JavaScript, obiekt jest skrótem (raczej, jeśli używasz Prototype lub innego frameworka, powinien zostać zakwalifikowany jako „specjalny rodzaj skrótu” - ale prosta forma działa w tym przykładzie):

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

Jedynym powodem, dla którego serialize()może być konieczne w Javascript, jest wycięcie funkcji, odniesień do innych obiektów itp.

Wracając do przykładu w języku C # - właśnie przestaliśmy .Serialize()być niepotrzebni. Obiekt jest skrótem, jest już zserializowany, dalsza „serializacja” i tak musiałaby być wykonana ręcznie we własnym kodzie. Pozostaje ci tylko to .ToString().

Czy .stringify()ma to teraz większy sens?

Izkata
źródło
tak, stringify ma sens, jednak nadal wolałbym używać.toString()
Chase Florell
7
toString może znaczyć wszystko. JSON.stringify to wyraźnie JSON.
Brandon
11

Wynika to z faktu, że notacja JSON została określona w 1999 r., A nie po 2002 r. ( Została asp.netwydana w tym roku). więc myślę, że nie wiedzieli o serialize.

Żarty na bok,

Słysząc to słowo serialization, pierwszą rzeczą, która przychodzi mi na myśl, jest konwersja danych na bajty, tutaj JSON.stringify ma doskonały sens, ponieważ przekształca obiekt w reprezentację łańcuchową, a nie bajtową.

PS:

@Case Florell, nie można po prostu dodać JSON.serialize, ponieważ w trybie ścisłym ten kod może się nie powieść w niektórych przeglądarkach.

jak JSONnie jest to twój przeciętny Obiekt.

Avinash R.
źródło
Wydaje mi się, że w moim (ograniczonym) doświadczeniu serializowanie czegoś zawsze przekształciło go w jakiś ciąg znaków do płaskiego przechowywania plików. Rozumiem jednak, co mówisz.
Chase Florell
Myślałem, że to był 2001 .. zobacz wikipedia . Nazwa była prawdopodobnie osobistą preferencją Douglasa Crockforda. 1999 jest rokiem, w którym wyszedł trzeci standard ECMA, na którym opiera się JSON.
Martijn Pieters
1
Serializacja @ChaseFlorell po prostu dosłownie odnosi się do przekształcenia obiektu w pamięci w ciągły, ciągły format danych, aby mógł być zawarty w atomie, uważam, że bardziej powszechną metodą wykonania tego byłoby odwrotna reprezentacja, do wysyłania przez sieci lub inne tego typu.
Jimmy Hoffa,
@avinashr, re: your ps: edit ... to skrzypce nie wydają się zawieść. czy możesz wyjaśnić, w jaki sposób „ JSONnie jest twoim przeciętnym przedmiotem”? Nie jestem ponury, po prostu niejasne, co masz na myśli.
Chase Florell,
2
@ChaseFlorell jest poprawny - w odniesieniu do Javascript JSON jest podzbiorem prawidłowych obiektów JavaScript. Zobacz moją odpowiedź na prosty przykład: Wszystkie poprawne JSON są poprawnymi obiektami / skrótami JavaScript, ale nie wszystkie obiekty / skróty JavaScript są poprawnymi JSON. Jest nawet w nazwie - JSON oznacza „JavaScript Object Notation”.
Izkata,