2015-11-10 2 views
2

Я пытаюсь сериализовать объект JSON для отправки его с контроллера на представление. Несмотря на чтение многих похожих вопросов, я не нашел решения, которое хорошо работает.Сериализовать объект JSON из предварительно скомпилированного класса в приложении MVC

В моем случае у меня есть объект List<MyType>, где находится предварительно скомпилированный класс. Но когда я попытался сериализовать данные с помощью:

DataContractJsonSerializer ser = new DataContractJsonSerializer(typeof(MyType)); 

я получил следующее сообщение об ошибке:

Additional information: Type MyType cannot be serialized. Consider marking it with the DataContractAttribute attribute, and marking all of its members you want serialized with the DataMemberAttribute attribute.

Однако, так как это предварительно скомпилированный класс, я не могу отметить членов. Как я могу это решить?

+0

Есть ли особая причина, по которой вы используете 'DataContractJsonSerializer', а не только метод' Json' на вашем контроллере? На самом деле, наверное, я должен сначала спросить: используете ли вы ASP.NET MVC? –

+0

Привет, Брайан! Нет, я просто использовал 'DataContractJsonSerializer', но не по определенной причине. Что бы вы мне порекомендовали? И да, на самом деле, мое приложение представляет собой ASP.NET MVC. Я забыл упомянуть ранее :) – AdaByron

+0

Посмотрите на библиотеку JSON.NET.Вы должны иметь возможность делать то, что хотите использовать методы в этой библиотеке. –

ответ

0

DataContractJsonSerializer использует выбора в семантику, это означает, что вы должны пометить класс (ы) для сериализации с атрибутом [DataContract], и пометить все члены этих классов, которые вы хотите сериализовать [DataMember]. Если вы не можете изменить классы (потому что они предварительно скомпилированы или вы не управляете иным образом исходным кодом), то с этим сериализатором вы не можете сделать это, не копируя данные в другой класс, чтобы мог быть сериализован. Но с ASP.NET MVC вы вообще не должны использовать DataContractJsonSerializer - этот сериализатор был создан для WCF и не очень гибкий или удобный, IMO.

Структура ASP.NET MVC имеет метод Json, встроенный в базовый контроллер, который использует JavaScriptSerializer за кулисами для сериализации объектов модели. Этот сериализатор не требует разметки классов с атрибутами, и поскольку он испечен, вам не нужно вводить какой-либо специальный код сериализации в методы вашего контроллера, чтобы использовать его. Просто измените метод, чтобы вернуть JsonResult вместо ActionResult, а затем передайте свой объект методу Json в качестве последнего порядка ведения бизнеса.

Например:

[HttpGet] 
public JsonResult GetItem(int id) 
{ 
    PrecompiledClass pc = RetrieveObjectFromDatabaseOrWhatever(id); 

    return Json(pc, JsonRequestBehavior.AllowGet); 
} 

The JavaScriptSerializer имеет некоторые ограничения, которые я не буду вдаваться в здесь, что вы, вероятно, не ударить в большинстве нормальных обстоятельствах. Но если вы обнаружите, что JavaScriptSerializer не подходит под ваши нужды, вы можете переключиться на надежный сторонний сериализатор, например Json.Net. См. ASP.NET MVC and Json.NET и Using JSON.NET as the default JSON serializer in ASP.NET MVC - is it possible?, чтобы узнать больше об этой опции.

+0

Вау! Какая ценная информация. Я уже сделал то, что вы мне рекомендовали, и, видимо, я не получил никаких ошибок, но как мне получить данные из представления? – AdaByron

+0

Разве вы не используете какой-то AJAX (например, [jQuery] (https://learn.jquery.com/ajax/)) на ваш взгляд? Предположительно, именно это привело вас к тому, что вы сначала сериализуете свои данные в JSON. Если вы не знакомы с этим, то, вероятно, вам пора работать над некоторыми учебниками по этому вопросу. –

+0

Да, я использовал AJAX с методом 'post', чтобы отправить форму, и мне пришлось извлекать данные из' success'. Спасибо за помощь!! – AdaByron

0

Я бы не рекомендовал использовать предварительно скомпилированный класс в качестве модели вашего представления. Разделение проблем и многое другое.

Создайте новый класс MyTypeViewModel, который будет иметь только те свойства, о которых должен знать пользовательский интерфейс, и сопоставить свойства MyType с MyTypeViewModel. Затем вернитесь, как это в вашем методе контроллера, если вы возвращать результат как часть вызова API: return Json(myTypeViewModel, JsonRequestBehavior.AllowGet);

или return View(myTypeViewModel) если вы хотите, чтобы сделать весь вид.

+0

Спасибо, Бен! К сожалению, выбор класса является ограничением проблемы. Кроме того, мне нужно много свойств из класса, поэтому было бы непросто создать 'MyTypeViewModel'. – AdaByron

Смежные вопросы