Ivan Rep
Ivan Rep

Reputation: 355

Controller.json set Serialization.ReferenceLoopHandling

is there a way to set Controller.Json ReferenceLoopHandling property?

It is currently causing a self referencing loop when parsing entities with navigation properties defined on both ends. This problem is solved by setting

ReferenceLoopHandling = Newtonsoft.Json.ReferenceLoopHandling.Ignore;

Is there a way to do this for Controller.Json method?

I found this piece of code, but it does not seem to work.

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

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

Upvotes: 8

Views: 6928

Answers (3)

Dustin C
Dustin C

Reputation: 265

This worked for me with .NET Core 3.0.

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

Upvotes: 2

Tanato
Tanato

Reputation: 1173

I think that a prettier solution for this is to add JsonOptions in your ConfigureServices like:

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

Upvotes: 15

Jimmy Hannon
Jimmy Hannon

Reputation: 739

The question is from some time ago but it still can help other people.

Try this in your ConfigureServices method of the Startup class:

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

or

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

Upvotes: 2

Related Questions