Использование нового сериализатора Json с HttpContext.Response в ASP. NET Core 3.1 - PullRequest
4 голосов
/ 16 марта 2020

Когда мы хотим сериализовать объект в строку JSON в ASP. NET конвейере ядра, нам нужно работать с HttpContext.Response.Body.WriteAsync, если я что-то не упустил, так как нет свойства Result который мы можем легко использовать для присвоения JsonResult объекта.

Если нет лучшей альтернативы, как именно достигается сериализация с помощью вышеуказанного метода?

Примечание: Опции для сериализатора JSON должны совпадать с параметрами (по умолчанию), используемыми в ASP. NET Core 3.1.

При желании (не в нашем случае), их можно изменить с помощью промежуточного программного обеспечения IServiceCollection.AddJsonOptions.

Пример:

app.Use( next =>
{
    return async context =>
    {
        if (<someFunkyConditionalExample>)
        {
            // serialize a JSON object as the response's content, returned to the end-user.
            // this should use ASP.NET Core 3.1's defaults for JSON Serialization.
        }
        else
        {
            await next(context);
        }
    };
});

1 Ответ

2 голосов
/ 16 марта 2020

Прежде всего, вы можете использовать эти методы расширения для записи строк непосредственно в ваш ответ, например:

await context.Response.WriteAsync("some text");

Убедитесь, что вы импортировали правильное пространство имен, чтобы дать вам доступ к этим расширениям:

using Microsoft.AspNetCore.Http;

Во-вторых, если вы хотите получить настройки сериализатора JSON, которые используются платформой, вы можете извлечь их из контейнера DI:

var jsonOptions = context.RequestServices.GetService<IOptions<JsonOptions>>();

Таким образом, ваш полный конвейерный код будет выглядеть примерно так:

app.Use(next =>
{
    return async context =>
    {
        if (<someFunkyConditionalExample>)
        {
            // Get the options
            var jsonOptions = context.RequestServices.GetService<IOptions<JsonOptions>>();

            // Serialise using the settings provided
            var json = JsonSerializer.Serialize(
                new {Foo = "bar"}, // Switch this with your object
                jsonOptions?.Value.JsonSerializerOptions);

            // Write to the response
            await context.Response.WriteAsync(json);
        }
        else
        {
            await next(context);
        }
    };
});
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...