Сериализация объекта JSON из предварительно скомпилированного класса в приложении MVC
Я пытаюсь сериализовать объект JSON, чтобы отправить его из контроллера в представление. Несмотря на то, что я прочитал много подобных вопросов, я не нашел решения, которое работает хорошо.
В моем случае у меня есть объект List<MyType>, где находится предварительно скомпилированный класс. Но когда я попытался сериализовать данные с помощью:
DataContractJsonSerializer ser = new DataContractJsonSerializer(typeof(MyType));
Я получил следующую ошибку:
Дополнительная информация: Тип
MyTypeне может быть
сериализованный. Подумайте о том, чтобы пометить его атрибутом DataContractAttribute
атрибут, и маркировка всех его членов, которые вы хотите сериализовать с помощью
Атрибут DataMemberAttribute.
Однако, поскольку это предварительно скомпилированный класс, я не могу пометить его члены. Как я могу решить эту проблему?
2 ответов:
DataContractJsonSerializerиспользует семантику opt-in, которая означает, что вы должны пометить класс(ы), подлежащий сериализации, атрибутом[DataContract]и пометить все члены тех классов, которые вы хотите сериализовать с помощью[DataMember]. Если вы не можете изменить классы (потому что они предварительно скомпилированы или вы не контролируете исходный код), то с этим сериализатором мало что можно сделать, кроме копирования данных в другой класс, который может быть сериализован. Но, с ASP.NET MVC вы не должны действительно используйтеDataContractJsonSerializerв любом случае-этот сериализатор был создан для WCF и не очень гибок или удобен для пользователя, IMO.ASP.NET MVC framework имеет
Jsonметод, встроенный в базовый контроллер, который используетJavaScriptSerializerза кулисами для сериализации объектов модели. Этот сериализатор не требует разметки классов атрибутами, и поскольку он запечен, вам не нужно вводить специальный код сериализации в методы контроллера для использования оно. Просто измените свой метод на returnJsonResultвместоActionResult, а затем передайте свой объект методуJsonв качестве последнего порядка работы.Например:
[HttpGet] public JsonResult GetItem(int id) { PrecompiledClass pc = RetrieveObjectFromDatabaseOrWhatever(id); return Json(pc, JsonRequestBehavior.AllowGet); }У
JavaScriptSerializerесть некоторые ограничения, в которые я здесь не буду вдаваться, и которые вы, вероятно, не попадете в большинстве нормальных обстоятельств. Но если вы обнаружите, чтоJavaScriptSerializerне соответствует вашим потребностям, вы можете переключиться на надежный сторонний сериализатор, такой как Json.Net . см. ASP.NET MVC и Json.NET и использование JSON.NET как сериализатор JSON по умолчанию в ASP.NET MVC-это возможно? чтобы узнать больше об этом варианте.
Я бы не рекомендовал использовать предварительно скомпилированный класс в качестве модели представления. Разделение забот и все такое.
Создайте новый класс MyTypeViewModel, который будет иметь только те свойства, о которых должен знать пользовательский интерфейс, и сопоставьте свойства из MyType в MyTypeViewModel. Затем вернитесь так в методе контроллера, если вы возвращаете этот результат как часть вызова API:
return Json(myTypeViewModel, JsonRequestBehavior.AllowGet);Или
return View(myTypeViewModel), Если вы хотите отобразить весь вид целиком.
Comments