Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

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);
        });
like image 921
Ivan Rep Avatar asked Jan 20 '16 05:01

Ivan Rep


3 Answers

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;
});
like image 69
Tanato Avatar answered Nov 15 '22 16:11

Tanato


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;
});
like image 29
Jimmy Hannon Avatar answered Nov 15 '22 15:11

Jimmy Hannon


This worked for me with .NET Core 3.0.

services.AddMvcCore().AddNewtonsoftJson(
    options => options.SerializerSettings.ReferenceLoopHandling =
        Newtonsoft.Json.ReferenceLoopHandling.Ignore);
like image 2
Dustin C Avatar answered Nov 15 '22 15:11

Dustin C