C# WebApi 2.0中的序列化问题

C# WebApi 2.0中的序列化问题,c#,rest,json.net,asp.net-web-api,asp.net-web-api2,C#,Rest,Json.net,Asp.net Web Api,Asp.net Web Api2,我正在首先使用EF6.0代码、AutoMapper和WebApi 2.0开发REST API 我正在努力序列化数据,或者更具体地说;选择响应请求时应序列化的内容 假设我正在为足球联赛创建一个应用程序,该应用程序包含以下类: public class Player { public String Name { get; set; } public virtual ICollection<Team> Teams { get; set; } // example } pu

我正在首先使用EF6.0代码、AutoMapper和WebApi 2.0开发REST API

我正在努力序列化数据,或者更具体地说;选择响应请求时应序列化的内容

假设我正在为足球联赛创建一个应用程序,该应用程序包含以下类:

public class Player
{
    public String Name { get; set; }
    public virtual ICollection<Team> Teams { get; set; } // example
}

public class Team
{
    public String Name { get; set; }
    public virtual ICollection<Team> Players { get; set; }
    public virtual ICollection<FootballGame> Games { get; set; }
}

public class FootballGame
{
    public Team Team1 { get; set; }
    public Team Team2 { get; set; }
    public DateTime DateTime { get; set; }
}
我怎样才能以一种简单的方式选择只返回球员,而对于团队来说,返回可以获取团队数据的url,比如:

{
  "Id": 1,
  "Name": "Jon Jones",
  "Teams": "http://url/api/player/1/teams/"
}
编辑: 根据建议,通过否认懒散,我只得到:

{
  "Id": 1,
  "Name": "Jon Jones",
  "Teams": []
}

如果这样做的话,是否有“最佳实践”来添加uri以使团队加入其中?

在构建Web服务时,您应该禁用延迟加载-最好强制自己明确获取哪些数据。另一种方法是在不希望序列化程序查看的类的属性上删除[JsonIgnore]属性。

正如Robert Levy所建议的,应该禁用延迟加载。或者,除了实体之外,还应该定义DTO(数据传输对象)。这些只是不属于实体框架的普通对象。它们的目的是让您定义一个外观与数据库不同的外部API。所以,您可以查询您的实体并编写一些代码,将POCO的内容映射到DTO

如果您正在做一些非常简单的事情,这可能看起来有些过分(因为您的DTO可能看起来与您的entity framework对象一模一样)

不过,对于任何非琐碎的事情,将数据库设计与API的拓扑结构解耦可能会很有用。

请检查以下线程:
{
  "Id": 1,
  "Name": "Jon Jones",
  "Teams": []
}