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, чем литеральные значения, поэтому очень трудно полностью сериализовать объект в месте, внешнем по отношению к ВМ.