ASP. NET Core 3.1 Как заставить контроллер использовать System.Text. Json для сериализации и десериализации - PullRequest
0 голосов
/ 27 апреля 2020

Я конвертирую из. NET CORE 2.2 в 3.1. Можно ли заставить контроллер использовать System.Text.Json для сериализации и десериализации любого входящего запроса и ответа? В основном, когда приходит запрос, я хочу использовать System.Text.Json, а когда ответ выходит, я хочу использовать System.Text.Json. Если да, то как?

Причина для этого заключается в том, что Microsoft действительно выдвигает эту библиотеку в качестве замены Newtonsoft.Json, так как она стала намного безопаснее и быстрее. Но я не могу найти никакой документации на страницах Microsoft, которая отражает это. Мне трудно, чтобы Microsoft не обновляла свой код для использования этой новой библиотеки.

ОБНОВЛЕНИЕ

Я не могу заставить System.Text.Json связать модель путем анализа с application/vnd.api+json - модель NULL. Он будет привязан только если я проанализирую, используя application/json. Это проблематично c, поскольку для спецификации JSON: API требуется application/vnd.api+json (см. Здесь: { ссылка }). Я попытался украсить контроллер [Consumes("application/vnd.api+json")], но это не работает.

Как заставить System.Text.Json связывать модели, используя application/vnd.api+json? Мое первоначальное предположение при задании этого вопроса было таким: NET Core 3.1 не использовал System.Text.Json Поскольку никто не дал ответа, кроме нескольких комментариев, я решил расширить этот вопрос.

ChangePassword Модель:

using System.ComponentModel.DataAnnotations;
using System.Text.Json.Serialization;

namespace ABC.Model.Clients
{
    public class ChangePassword
    {   
        public ChangePassword() { }

        [Required]
        [JsonPropertyName("old-password")]
        public string OldPassword { get; set; }

        [Required]
        [JsonPropertyName("new-password")]
        public string NewPassword { get; set; }

        [Required]
        [JsonPropertyName("confirm-password")]
        public string ConfirmPassword { get; set; }
    }
}

Почтальон запрос:

{ 
    "data": {
        "attributes": {
            "old-password" : "**********",
            "new-password" : "**********",
            "confirm-password" : "**********"
        },
        "type": "change-passwords"
    }
}

Ответы [ 2 ]

1 голос
/ 30 апреля 2020

. NET В Core 3.0 по умолчанию используется System.Text. Json. Проверьте также официальную документацию , где это описано.

Относительно поддержки application/vnd.api+json и JSON: API в. NET Core 3.0. Мне не известно о какой-либо поддержке этого в ASP. NET Core. Это отдельный стандарт от простого веб-API. Вы не можете просто добавить его как другой тип, который вы принимаете, и ожидаете, что он будет работать.

Я нашел проект на GitHub JSON API. Net Core , который обеспечивает основу для сборки JSON: API совместимые службы веб-API. Версия для. NET Core 3.0 в настоящий момент все еще находится в Alpha и в настоящее время использует Newtonsoft. Json, что не то, что вам нужно. Вы можете посмотреть на источник, чтобы увидеть, как обрабатывать такие запросы и, возможно, построить собственное решение на его основе. Или присоединитесь к проекту и помогите им также сделать System.Text.Json версию.

0 голосов
/ 03 мая 2020

Вам необходимо добавить application/vnd.api+json тип носителя для SupportedMediaTypes из SystemTextJsonInputFormatter.

services.AddMvc(options =>
{
    var formatter = options.InputFormatters.OfType<SystemTextJsonInputFormatter>().FirstOrDefault();
    formatter.SupportedMediaTypes.Add("application/vnd.api+json");
});
...