Add JsonConverters to Azure Function

Viewed 607

When building a service in C# I typically do something like this to register custom JSONConverters in my startup class:

public void ConfigureServices(IServiceCollection services)
{
    var serializerSettings = CreateJsonSerializerSettings();
    services
        .AddControllers(opts =>
        {
        //add some filters
        })
        .AddNewtonsoftJson(options =>
        {
            options.SerializerSettings.ContractResolver = serializerSettings.ContractResolver;
            options.SerializerSettings.Converters = serializerSettings.Converters;
        })      
                
    private static JsonSerializerSettings CreateJsonSerializerSettings()
    {
        var settings = new JsonSerializerSettings() { ContractResolver = _someContractResolver};
        settings.Converters.Add(comeCustomConverter.Instance);
        return settings;
    }
}

When I attempt to use the same approach in an azure function, the serializers don't seem to register:

    services.AddMvcCore().AddNewtonsoftJson(options =>
    {
        options.SerializerSettings.ContractResolver = serializerSettings.ContractResolver;
        options.SerializerSettings.Converters = serializerSettings.Converters;
    }
        );

I'm guessing that Azure Functions use their own special type of "middleware". What do I need to do to register my converters so that they show up when I'm trying to serialize/deserialize input?

1 Answers

In your Program.cs you can configure the JsonSerializer of your choice by using IServiceCollection.Configure<>

 var host = new HostBuilder().ConfigureFunctionsWorkerDefaults()
                             .ConfigureServices((hostBuilderContext, services) =>
{
    //When using System.Text.Json (Preferred)
    services.Configure<JsonSerializerOptions>(o =>
    {
      o.PropertyNameCaseInsensitive = true;
    });
    //When using Newtonsoft.Json for legacy reasons
    services.Configure<JsonSerializerSettings>(s =>
    {
      s.ContractResolver = new CamelCasePropertyNamesContractResolver();
    });
}.Build();

return host.RunAsync();
Related