Почему Javascript использует JSON.stringify вместо JSON.serialize?


18

Мне просто интересно о "stringify" против "serialize" . Для меня это одно и то же (хотя я могу ошибаться), но в моем прошлом опыте (в основном с ) я использую Serialize()и никогда не использую Stringify().

Я знаю, что могу создать простой псевдоним в Javascript,

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

// or
JSON.serialize = JSON.stringify;

http://jsfiddle.net/HKKUb/

но мне просто интересно, какая разница между ними и почему был выбран stringify.


для сравнения вот как вы сериализуете 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()смысл сейчас?


да, stringify имеет смысл, однако я все же предпочел бы использовать.toString()
Чейз Флорелл

7
toString может означать что угодно. JSON.stringify - это явно JSON.
Брэндон

11

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

Без шуток,

Услышав слово serialization, первое, что приходит мне в голову, это как преобразовать данные в байты, здесь JSON.stringify имеет смысл, поскольку он преобразует объект в строковое представление, а не в байтовое представление.

PS:

@ Чейз, Флорелл, вы не можете просто добавить JSON.serialize, так как в строгом режиме этот код может фактически не работать в некоторых браузерах.

как JSONне ваш средний объект.


Я предполагаю из моего (ограниченного) опыта, что сериализация чего-то всегда преобразовывала это в некоторую форму строки для хранения плоских файлов. Я понимаю, что вы говорите, хотя.
Чейз Флорелл

Я думал, что это был 2001 год .. см. Википедию . Имя было, вероятно, личным предпочтением Дугласа Крокфорда. В 1999 году вышел третий стандарт ECMA, на котором основан JSON.
Мартин Питерс

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

@avinashr, re: ваш ps: edit ... эта скрипка , похоже, не сработает . Можете ли вы объяснить, как " JSONне ваш средний объект"? Я не извращенец, просто неясно, что ты имеешь в виду.
Чейз Флорелл

2
@ChaseFlorell правильно - что касается Javascript, JSON является подмножеством допустимых объектов Javascript. Смотрите мой ответ для простого примера: все допустимые JSON являются действительными объектами / хэшами Javascript, но не все объекты / хеши Javascript являются допустимыми JSON. Это даже в названии - JSON расшифровывается как «JavaScript Object Notation».
Изката
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.