Skip to main content
Version: v1.7.0

JSON formatting

The Arcus.WebApi.Hosting.AzureFunctions library provides a way to restrict and configure the JSON input and output formatting of your application. This allows for an easier and more secure formatting when working with JSON types.

โš  These features are only available for Azure Functions using the isolated functions worker. For more information on the difference between in-process and isolated Azure Functions, see Microsoft's documentation.

Installation#

These features require to install our NuGet package:

PM > Install-Package Arcus.WebApi.Hosting.AzureFunctions

Restricting JSON format#

We have provided an extension that will allow you to restrict your input and output formatting to only JSON formatting (Only the SystemTextJsonInputFormatter will remain). This means that all other incoming content will result in UnsupportedMediaType failures and outgoing content will fail to serialize back to the sender. With this functionality, you'll be sure that you only have to deal with JSON.

โ— Make sure that the Content-Type and Allow are set to application/json.

Following example shows you how you can configure this:

using Microsoft.Extensions.Hosting;
 IHost host = new HostBuilder()    .ConfigureFunctionsWorkerDefaults(builder =>    {        builder.UseOnlyJsonFormatting();    })    .Build();

Configure JSON format#

We have provided an extension that will allow you to configure a JsonObjectSerializer which will be registered in the application services. This JSON serializer can be injected in your Azure Function implementation so that incoming and outgoing models are handled the same way, across multiple functions. This makes the JSON formatting more centralized and easier to maintain.

Following example shows you how you can configure these options:

using System.Text.Json;using Microsoft.Extensions.Hosting;
IHost host = new HostBuilder()    .ConfigureFunctionsWorkerDefaults(builder =>    {        builder.ConfigureJsonFormatting(options =>        {            options.Converters.Add(new JsonStringEnumConverter());        });    })    .Build();

After that, the JsonObjectSerializer can be injected in your function for deserialization/serialization of incoming/outgoing models:

using Azure.Core.Serialization;using Microsoft.Azure.Functions.Worker;using Microsoft.Azure.Functions.Worker.Http;
public class OrderFunction{    private readonly JsonObjectSerializer _jsonSerializer;
    public OrderFunction(JsonObjectSerializer jsonSerializer)    {        _jsonSerializer = jsonSerializer;    }
    [Function("order-processing")]    public async Task<HttpResponseData> Run(        [HttpTrigger(AuthorizationLevel.Anonymous, "post")] HttpRequestData request)    {        var order = await request.ReadFromJsonAsync<Order>(_jsonSerializer);
        HttpResponseData response = request.CreateResponse();        await response.WriteAsJsonAsync(order, _jsonSerializer);        return response;    }}