一个媒体类型的格式是串行数据时的Web API编写的HTTP响应体的对象。内置格式化程序支持JSON和XML输出。默认情况下,这两个格式化程序都按值序列化所有对象。
如果对象图包含循环引用,则按值序列化会产生问题。这就是Order和OrderDetail类的情况,因为每个都拥有对另一个的引用。
在解决方案资源管理器中,展开App_Start文件夹并打开名为WebApiConfig.cs的文件。将以下代码添加到WebApiConfig类中:
public static class WebApiConfig
{
public static void Register(HttpConfiguration config)
{
config.Routes.MapHttpRoute(
name: "DefaultApi",
routeTemplate: "api/{controller}/{id}",
defaults: new { id = RouteParameter.Optional }
);
// New code:
var json = config.Formatters.JsonFormatter;
json.SerializerSettings.PreserveReferencesHandling =Newtonsoft.Json.PreserveReferencesHandling.Objects;
config.Formatters.Remove(config.Formatters.XmlFormatter);
}
}
此代码设置JSON格式化程序以保留对象引用,并完全从管道中删除XML格式化程序。(您可以配置XML格式化程序以保留对象引用,但它需要更多工作,我们只需要JSON用于此应用程序。有关更多信息,请参阅处理循环对象引用 )
json格式由JsonMediaTypeFormatter类提供。默认情况下,JsonMediaTypeFormatter使用Json.NET库来执行序列化。Json.NET是第三方开源项目,可以将JsonMediaTypeFormatter 类配置为使用DataContractJsonSerializer而不是Json.NET。这时,
请将UseDataContractJsonSerializer属性设置为true
var json=GlobalConfiguration.Configuration.Formatters.JsonFormatter;
json.UseDataContractJsonSerializer=true;