如何配置ASP.NET Core来处理循环引用而不破坏正文的响应?

时间:2018-03-18 16:30:01

标签: asp.net asp.net-core asp.net-core-mvc asp.net-core-2.0

我有这个ASP.NET Core 2.0 MVC控制器:

[Route("api/[controller]")]
public class SampleDataController : Controller
{
    [HttpGet("[action]")]
    public Example Demo()
    {
        return new Example("test");
    }

    public class Example
    {
        public Example(string name)
        {
            Name = name;
        }

        public string Name { get; }

        public IEnumerable<Example> Demos
        {
            get { yield return this; }
        }
    }
}

查询/api/SampleData/Demo时,我得到了回复正文:

{"name":"test","demos":[

...这显然是非常破碎的类JSON输出。

我如何以及在何处配置基于ASP.Net Core 2.0 MVC的应用程序,以使框架以不破坏输出的方式序列化循环引用? (例如,通过引入$ref$id。)

1 个答案:

答案 0 :(得分:3)

为了打开JSON.Net序列化的引用,您应该将PreserveReferencesHandling SerializerSettings属性设置为PreserveReferencesHandling.Objects枚举值。

在ASP.Net Core中,您可以通过Startup.ConfigureServices方法中的调整来实现:

services.AddMvc()
    .AddJsonOptions(opt =>
    {
        opt.SerializerSettings.PreserveReferencesHandling = PreserveReferencesHandling.Objects;
    });

现在模型将被序列化为以下正确的JSON:

{
  "$id": "2",
  "name": "test",
  "demos": [ { "$ref": "2" } ]
}