Чому Javascript використовує JSON.stringify замість JSON.serialize?


18

Мені просто цікаво про "строфікувати" проти "серіалізувати" . Для мене вони те саме (хоча я можу помилитися), але в своєму минулому досвіді (в основному з ) я використовую Serialize()і ніколи не використовую Stringify().

Я знаю, що можу створити простий псевдонім у Javascript,

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

// or
JSON.serialize = JSON.stringify;

http://jsfiddle.net/HKKUb/

але мені просто цікаво про різницю між ними та чому було обрано строфікацію.


для порівняння, ось як ви серіалізуєте XML до рядка в 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
Насправді ти просто не можеш це зробити JSON.serialize = JSON.stringify?
Даніель Діпаоло

чому так, ти можеш.
Чейз Флорелл

1
Я вважаю, що після перечитування мого запитання я бачу, що у своєму прикладі C # я серіалізую XML і потім перетворюю серіалізований об'єкт ToString();. Там всередину затирає.
Чейз Флорелл

Я думаю, що для наступності було б краще (для мене) мати метод, який виглядає приблизно так ... JSON.serialize(obj).toString();або jsonObject().toString();... таким чином це виглядатиме так само, як мій C # ... але зараз я над цим ускладнюю.
Чейз Флорелл

Відповіді:


12

Погляньте детальніше на два коментарі, які ви поставили до питання:

Я вважаю, що після перечитування свого запитання я бачу, що у своєму прикладі C # я серіалізую XML і потім перетворюю серіалізований об’єкт ToString () ;. Там всередину затирає.

і

Я думаю, що для наступності краще було б (для мене) мати метод, який виглядає приблизно так ... JSON.serialize (obj) .toString (); або jsonObject (). toString (); ... таким чином це було б схоже на мій C # ... але тепер я над цим ускладнюю.

Тепер пам’ятайте, що в Javascript об’єкт - хеш (скоріше, якщо використовується Prototype або інша рамка, його слід кваліфікувати як «особливий вид хешу» - але проста форма працює для цього прикладу):

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

Єдина причина, яка serialize()може бути необхідною в JavaScript, - це вирізати функції, посилання на інші об'єкти тощо.

Отже, щоб повернутися до вашого прикладу C # - ми просто вирішили .Serialize()як непотрібне. Об'єкт - хеш, він уже серіалізований, подальше "серіалізацію" все одно доведеться робити вручну у власному коді. Все, що від тебе залишає .ToString().

Чи .stringify()має тепер більше сенсу?


так, стримувати має сенс, однак я все-таки скоріше використовую.toString()
Чейз Флорелл

7
toString може означати що завгодно. JSON.stringify - це явно JSON.
Брендон

11

Це тому, що нотація JSON була визначена в 1999 році не після 2002 року ( asp.netвипущена в тому ж році). тож я здогадуюсь, що вони не знали про це serialize.

Жарточки,

Почувши це слово serialization, перше, що мені спадає на думку, це як перетворення даних у байти, тут JSON.stringify має ідеальний сенс, оскільки він перетворює об'єкт у рядкове подання, а не в байтове подання.

PS:

@Chase Florell, ви не можете просто додати JSON.serialize, оскільки в суворому режимі цей код може фактично вийти з ладу в деяких браузерах.

як JSONце не ваш середній об’єкт.


Я вважаю, що в моєму (обмеженому) досвіді серіалізація чогось завжди перетворювала це в якусь форму рядка для плоского зберігання файлів. Я розумію, що ти кажеш.
Чейз Флорелл

Я думав, що це 2001 рік .. див. Вікіпедію . Ім'я, ймовірно, було особистим уподобанням Дугласа Крокфорда. 1999 рік - це рік, коли вийшов 3-й стандарт ECMA, на якому засновано JSON.
Martijn Pieters

1
@ChaseFlorell серіалізація просто буквально стосується перетворення об'єкта пам'яті в послідовно послідовний формат даних, щоб він міг міститися в атомі, я вважаю, що більш поширеним методом цього може бути подання в байтаному режимі для надсилання через мережі чи інше подібне.
Джиммі Хоффа

@avinashr, re: ваш ps: редагувати ... ця загадка не здається невдалою. чи можете ви пояснити, як " JSONне ваш середній об'єкт"? Я не хиткий, просто незрозуміло, що ти маєш на увазі.
Чейз Флорелл

2
@ChaseFlorell правильний - що стосується Javascript, JSON - це підмножина дійсних об'єктів Javascript. Дивіться мою відповідь на простий приклад: Усі дійсні JSON є дійсним об'єктом / хешем Javascript, але не всі об'єкти / хеші Javascript є дійсними JSON. Це навіть у назві - JSON розшифровується як "Нотація об'єкта JavaScript".
Ізката
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.