未能在Web API中序列化响应

我正在研究ASP.NET MVC的Web API,我有这个错误:

“ObjectContent`1”types未能序列化内容types为“application / xml; 字符集= UTF-8' 。

我的控制器是:

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

为什么我得到这个错误?

对我来说,这是一个循环引用的问题。

接受的答案不适用于我,因为它只会改变JSON格式化程序的行为,但是当我从浏览器调用服务时,我正在获取XML。

为了解决这个问题,我closures了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结果,你将需要find一个不同的解决scheme。

在你的global.asax文件中,在Application_start()方法中添加这一行:

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

我希望能帮到你!

我遇到了同样的问题。 我解决了它。 我把默认的构造函数放在DTO类中。

例如:

 public class User { public User() { } } 

希望它能和你一起工作!

把这个在构造函数中。 希望解决这个问题:

  public MyController() { db.Configuration.ProxyCreationEnabled = false; } 

我find了两个解决scheme。 第一个也是最容易实现的方法是将任何IEnumerables,ICollections更改为Listtypes。 WebAPI可以序列化这个对象,但是它不能序列化接口types。

 public class Store { [StringLength(5)] public string Zip5 { get; set; } public virtual List<StoreReport> StoreReports { get; set; } //use a list here } 

另一种select是不使用本机JSON序列化程序,并在WebApiconfiguration的注册方法中运行此覆盖:

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

解决方法很简单。

LINQ查询添加.ToList()(或ToDictionary,如果需要)。

它将执行加载而不是延迟加载数据

如果您正在使用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模型

请检查web api文档中的这个问题, 处理循环对象引用

问候

**从客户端请求web api / wcf / …时发生此错误,但作为副作用,您将需要通过include关键字包含依赖关系。 **

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

如果您在Entity Framework中使用web api,则解决scheme可能无法使用Json序列化Web API中的响应

基本上,您需要创build一个对应于每个EF模型的模型,这样可以消除类之间的依赖关系,并且可以轻松地进行序列化。

代码:(取自参考链接)

创build一个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; } } 

但如果你发现这个问题与其他实体/类,你必须为每个类创build一个新的DTO,如果你有很多他们,你可以find一个问题,也认为创build一个DTO只为解决这个问题是不是最好的方法…

你试过这个吗?

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

问候

嗯,以下可能会有所帮助。

我得到了同样的exception,在我的情况下,我先传递实体代码创build的实际poco实体。 既然它包含了与其他实体的关系,我只是在它的顶部创build了viewmapper / dto实体来返回。

现在工作正常。

Poco实体:

 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;} } 

默认实体6使用XML ,在您的项目中,find文件“Global.asax”文件,并添加以下行:

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

这一行删除XML格式。

你的问题和我的很相似。 您不能直接从数据库返回数据。 为此,您必须创build模型并关联要显示的数据。

在我的例子中,有关于用户Json无法序列化的数据,我创build了一个userModel,并且在我的API中,我从数据库返回userModel而不是User。

User和UserModel之间的转换或关联数据的逻辑必须在API中。

无法使用Json序列化Web API中的响应

这是我从我的odata Web API调用回来的特定错误:

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

我终于弄清楚,我的dbContext类有一个格式不好的表名被分配在onModelCreating ..所以SqlClient死亡寻找一个表不存在我的数据库