Не удалось сериализовать ответ в Web API

Я работал над веб-API ASP.NET MVC, у меня эта ошибка:

Тип "ObjectContent`1" не смог сериализовать тело ответа для типа контента "application/xml"; кодировка = UTF-8'.

Мой контроллер:

public Employee GetEmployees()
{
    Employee employees = db.Employees.First();
    return employees;
}

почему я получаю эту ошибку?

Ответ 1

Для меня это была проблема с круговой ссылкой.

Принятый ответ не сработал у меня, потому что он меняет поведение форматирования JSON, но я получал XML, когда вызывал службу из браузера.

Чтобы исправить это, я отключил XML и принудительно возвращал только JSON.

В файле Global.asax поместите следующие строки вверху вашего метода Application_Start:

GlobalConfiguration.Configuration.Formatters.JsonFormatter.SerializerSettings.ReferenceLoopHandling = Newtonsoft.Json.ReferenceLoopHandling.Ignore;
GlobalConfiguration.Configuration.Formatters.Remove(GlobalConfiguration.Configuration.Formatters.XmlFormatter);

Теперь будут возвращены только результаты JSON. Если вам нужны результаты XML, вам нужно будет найти другое решение.

Ответ 2

в вашем файле global.asax, в методе Application_start() добавьте эту строку:

GlobalConfiguration.Configuration.Formatters.JsonFormatter.SerializerSettings.ReferenceLoopHandling = Newtonsoft.Json.ReferenceLoopHandling.Ignore;

Я надеюсь, что это поможет!

Ответ 3

У меня такая же проблема. И я решил это. Я поместил конструктор по умолчанию в класс DTO.

Пример:

public class User
{
    public User()
    {
    }
}

Надеюсь, он сработает с вами!

Ответ 4

Поместите это в конструктор. Надеюсь, что это решит проблему:

    public MyController()
    {

        db.Configuration.ProxyCreationEnabled = false;
    }

Ответ 5

Я нашел два решения. Первым и самым простым в реализации является изменение любых IEnumerables, ICollections для типа List. WebAPI может сериализовать эти объекты, однако он не может сериализовать типы интерфейсов.

public class Store
{

  [StringLength(5)]
    public string Zip5 { get; set; }

    public virtual List<StoreReport> StoreReports { get; set; }  //use a list here
 }

Другой вариант - не использовать собственный JSON-сериализатор и запустить это переопределение в методе Register WebApi Config:

        var json = config.Formatters.JsonFormatter;
        json.SerializerSettings.PreserveReferencesHandling = Newtonsoft.Json.PreserveReferencesHandling.Objects;
        config.Formatters.Remove(config.Formatters.XmlFormatter);

Ответ 6

Решение прост.

После запроса LINQ добавьте .ToList() (или ToDictionary, если это необходимо).

Он будет делать загрузку, чем ленивая загрузка данных.

Ответ 7

** эта ошибка возникает при вызове с веб-сайта api/wcf/... с клиентской стороны, но в качестве побочного эффекта вам необходимо включить зависимые отношения по ключевому слову include. **

public CustomerPortalContext()
            : base("Name=CustomerPortalContext")
        {
            base.Configuration.ProxyCreationEnabled = false;
        }

Ответ 8

Если вы работаете с EF, помимо добавления кода ниже на Global.asax

            GlobalConfiguration.Configuration.Formatters.JsonFormatter.SerializerSettings.ReferenceLoopHandling = Newtonsoft.Json.ReferenceLoopHandling.Ignore;
        GlobalConfiguration.Configuration.Formatters.Remove(GlobalConfiguration.Configuration.Formatters.XmlFormatter);          

Не забывайте импортировать

using System.Data.Entity;

Затем вы можете вернуть свои собственные модели EF

Ответ 10

Если вы используете веб-api с Entity Framework, решение может быть Не удалось выполнить сериализацию ответа в веб-API с помощью Json

В принципе, вам нужно создать модель, соответствующую каждой EF-модели, которая удаляет зависимости между классами и позволяет легко сериализоваться.

Код: (взято из ссылки)

Создайте UserModel

public class UserModel
{
    public string FirstName { get; set; }
    public string LastName { get; set; }
}

Измените мой метод GetAll()

public IEnumerable<UserModel> GetAll()
{
    using (Database db = new Database ())
    {
        List<UserModel> listOfUsers = new List<UserModel>();
        UserModel userModel = new UserModel();
        foreach(var user in db.Users)
        {
           userModel.FirstName = user.FirstName;
           userModel.LastName = user.LastName;
           listOfUsers.Add(userModel);
        }
        IEnumerable<UserModel> users = listOfUsers;

        return users;
    }
}

Ответ 11

hmmm, После этого может помочь.

Я получал такое же исключение, и в моем случае я сначала передавал фактический объект poco, созданный для кода сущности. Поскольку он содержит отношения с другими объектами, я просто создал объект viewmapper/dto поверх него для возврата.

Теперь он отлично работает.

Poco Entity:

public class Tag
{
public int Id{get;set;}
public string Title{get;set;}
public IList<Location> Locations{get;set;}
}

ViewMapper/Dto

public class TagResultsViewMapper
{
public int Id{get;set;}
public string Title{get;set;}
//just remove the following relationship 
//public IList<Location> Locations{get;set;}
}

Ответ 12

но если вы обнаружили эту проблему с другими объектами/классами, вам нужно создать новый DTO для каждого класса, и если у вас их много, вы можете найти проблему, также я думаю, что создаю DTO только для решение этой проблемы - не лучший способ...

Вы пробовали это?

var json = GlobalConfiguration.Configuration.Formatters.JsonFormatter;
json.SerializerSettings.PreserveReferencesHandling = 
Newtonsoft.Json.PreserveReferencesHandling.All;

Привет

Ответ 13

Объект по умолчанию 6 использует XML для apis в вашем проекте, найдите файл "Global.asax" File и добавьте эту строку:

GlobalConfiguration.Configuration.Formatters.Remove(GlobalConfiguration.Configuration.Formatters.XmlFormatter);

Эта строка удаляет XML Formatter.

Ответ 14

Ваш вопрос очень похож на мой. Вы не должны возвращать данные из базы данных напрямую. Для этого вам необходимо создать модель и ассоциировать данные, которые вы хотите показать.

В моем примере, Есть данные о пользователе, что Json не может сериализоваться, я создал userModel, и в моем API я возвращаю UserModel вместо User из базы данных.

Логика преобразования или ассоциирования данных между User и UserModel должна быть в API.

Не удалось выполнить сериализацию ответа в веб-API с помощью Json

Ответ 15

Это была особая ошибка, с которой я возвращался из моего вызова API Одаты:

The 'ObjectContent`1' type failed to serialize the response 
body for content type 'application/json; odata.metadata=minimal'.

Наконец-то выяснилось, что у моего класса dbContext было присвоено плохо форматированное имя таблицы в onModelCreating.. поэтому SqlClient умирал, ища таблицу , которая не существовала в моем db!!