JSON.parse, JS Typecasting и Revivers - PullRequest
       4

JSON.parse, JS Typecasting и Revivers

6 голосов
/ 13 августа 2011

Извините, если это глупый вопрос, это мой первый проект JS ...

Я пытаюсь десериализовать пользовательский объект в JS, используя JSON.Проблема в том, что JSON.parse () не возвращает объект в качестве исходного типа.Поскольку непосредственное приведение возвращаемого объекта к нужному типу не представляется возможным, это оставляет меня с опцией 'reviver' ...

Я что-то здесь упускаю?Разве не весь смысл JSON - избегать написания пользовательских методов для сериализации и десериализации объектов?Какой смысл использовать JSON, если мне нужно написать собственный метод «оживить» мой объект?

1 Ответ

9 голосов
/ 13 августа 2011

JSON - это формат для необработанных данных.Это очень примитивно.Он поддерживает словари (aka. Объекты javascript, хэши, ассоциативные массивы), массивы, строки, числа, логические значения и ноль.Вот и все.Причина, по которой он не делает больше, заключается в том, что эти примитивы не зависят от языка, и почти все языки программирования имеют встроенные инструменты для обработки данных такого типа.

Если у вас были другие обозначения, такие как «класс», то вдругстановится очень привязанным к конкретным языкам или кодовым базам и теряет свою широкую и универсальную применимость.

Так что думайте о JSON как о простых необработанных данных.JSON не является маршалингом экземпляра или полной сериализацией объекта.Так что да, вам нужно написать «revivers», если вы собираетесь сериализовать объекты JS, созданные из конструкторов.

Это подход , например, backbone.js принимает :

new Book({
  title: "One Thousand and One Nights",
  author: "Scheherazade"
});

Вы просто передаете свой простой объект данных (результат вашего JSON.parse()) вызову вашего конструктора по вашему выбору.Оттуда вы можете сделать любое количество вещей для считывания его значений в ваш новый объект.

В Javascript нет стандартного способа разбивать целые объекты, как вы можете, например, на ruby, используя Marhsal.dump(obj).


РЕДАКТИРОВАТЬ: последний важный момент ...

У объектов Javascript нет «типа», как вы могли бы подумать об этом в других языках.Объект Javascript - это просто словарь пар ключ / значение.Когда вы делаете что-то вроде new SomeClass(), вы получаете новый объект со специальным свойством prototype, которое указывает на свойство prototype функционального объекта SomeClass.Является ли объект * экземпляром SomeClass - это не столь очевидный вопрос, как вы думаете на первый взгляд.

Вместо этого вы можете спросить: «Что такое мой объект-функция конструктора?»или «Какие объекты находятся в моей цепочке прототипов?»

Итак, если вы хотите передать «тип» в JSON, который хранится в виде строки, то как бы вы сохранили ссылку на объект-прототип?Может быть, объект-прототип вообще не назван в глобальной области видимости, а доступен только через замыкание?Затем, когда вы записываете это в строку, у вас больше нет возможности ссылаться на этот объект-прототип.

Дело в том, что javascripts использует прототипный подход к созданию объекта в сочетании с его лексической областью видимости, основанной на замыкании, и тем фактом, чтообъекты хранят свои значения больше как указатели C, чем литеральные значения, поэтому очень трудно полностью сериализовать объект в месте, внешнем по отношению к ВМ.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...