Сериализация объекта JSON из предварительно скомпилированного класса в приложении MVC



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



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



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


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




Дополнительная информация: Тип MyType не может быть
сериализованный. Подумайте о том, чтобы пометить его атрибутом DataContractAttribute
атрибут, и маркировка всех его членов, которые вы хотите сериализовать с помощью
Атрибут DataMemberAttribute.




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

2 ответов:

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

ASP.NET MVC framework имеет Json метод, встроенный в базовый контроллер, который использует JavaScriptSerializer за кулисами для сериализации объектов модели. Этот сериализатор не требует разметки классов атрибутами, и поскольку он запечен, вам не нужно вводить специальный код сериализации в методы контроллера для использования оно. Просто измените свой метод на return JsonResult вместо 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

    Ничего не найдено.