Controller.json设置Serialization.ReferenceLoopHandling

时间:2016-01-20 05:55:04

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

有没有办法设置Controller.Json ReferenceLoopHandling属性?

当解析具有两端定义的导航属性的实体时,它当前正在引发自引用循环。通过设置

解决了这个问题
ReferenceLoopHandling = Newtonsoft.Json.ReferenceLoopHandling.Ignore;

有没有办法为Controller.Json方法执行此操作?

我找到了这段代码,但似乎没有用。

services.Configure<MvcOptions>(option =>
        {
            option.OutputFormatters.Clear();
            var jsonOutputFormatter = new JsonOutputFormatter();
            jsonOutputFormatter.SerializerSettings.ReferenceLoopHandling = Newtonsoft.Json.ReferenceLoopHandling.Ignore;

            option.OutputFormatters.Insert(0, jsonOutputFormatter);
        });

3 个答案:

答案 0 :(得分:13)

我认为更好的解决方案是在您的ConfigureServices中添加JsonOptions,如:

services.AddMvc().AddJsonOptions(options =>
{
    options.SerializerSettings.ReferenceLoopHandling = 
                               Newtonsoft.Json.ReferenceLoopHandling.Ignore;
});

答案 1 :(得分:2)

问题是从前一段时间开始,但它仍然可以帮助其他人。

在Startup类的ConfigureServices方法中尝试:

services.AddMvc(options =>
{
    ((JsonOutputFormatter)options.OutputFormatters.Single(f => f.GetType() == typeof(JsonOutputFormatter))).SerializerSettings.ReferenceLoopHandling = Newtonsoft.Json.ReferenceLoopHandling.Ignore;
});

services.AddMvc(options =>
{
    var jsonOutputFormatter = options.OutputFormatters.SingleOrDefault(f => f.GetType() == typeof(JsonOutputFormatter)) as JsonOutputFormatter;
    if (jsonOutputFormatter != null)
        jsonOutputFormatter.SerializerSettings.ReferenceLoopHandling = Newtonsoft.Json.ReferenceLoopHandling.Ignore;
});

答案 2 :(得分:0)

这适用于.NET Core 3.0。

services.AddMvcCore().AddNewtonsoftJson(
    options => options.SerializerSettings.ReferenceLoopHandling =
        Newtonsoft.Json.ReferenceLoopHandling.Ignore);