Как настроить JSONAPISerializer в качестве анализаторов ввода и вывода по умолчанию C # .NET Core 3

#c# #.net #web #ember.js #json-api

#c# #.net #веб #ember.js #json-api

Вопрос:

Я пытался настроить JSONAPISerializer (https://github.com/codecutout/JsonApiSerializer ) в качестве сериализатора по умолчанию как для ввода, так и для вывода, поэтому у меня может быть сервер .NET, совместимый с json: api, для приложения Ember с данными Ember.

Я успешно настроил сериализатор вывода, записав следующий код в файл Startup.cs:

 public void ConfigureServices(IServiceCollection services)
        {
            services.AddControllers();
            services.AddDbContext<Context>(options => options.UseSqlServer(Configuration.GetConnectionString("myDb")));

            var sp = services.BuildServiceProvider();
            var logger = sp.GetService<ILoggerFactory>();
            var objectPoolProvider = sp.GetService<ObjectPoolProvider>();

            services.AddMvc(opt =>
            {
                var serializerSettings = new JsonApiSerializerSettings();
**
                var jsonApiFormatter = new NewtonsoftJsonOutputFormatter(serializerSettings, ArrayPool<Char>.Shared, opt);
                opt.OutputFormatters.RemoveType<NewtonsoftJsonOutputFormatter>();
                opt.OutputFormatters.Insert(0, jsonApiFormatter);
**
                var mvcNewtonsoftSettings = new MvcNewtonsoftJsonOptions();

                var jsonApiInputFormatter = new NewtonsoftJsonInputFormatter(logger.CreateLogger<NewtonsoftJsonInputFormatter>(), serializerSettings, ArrayPool<Char>.Shared, objectPoolProvider, opt, mvcNewtonsoftSettings);
                opt.InputFormatters.RemoveType<NewtonsoftJsonInputFormatter>();
                opt.InputFormatters.Insert(0, jsonApiInputFormatter);
                //opt.InputFormatters.OfType<NewtonsoftJsonInputFormatter>().FirstOrDefault().SupportedMediaTypes.Add("application/vnd.api json");

            }).AddNewtonsoftJson();
        }
  

Но часть ввода еще не работает!

Я пытался получить код из приложения Ember, который следует этой структуре:

 {
  "data": 
  {
    "type": "manufacturer",
    "name": "Fabricante 1",
    "relationships": {
      "products": {
        "data": [
          {
            "type": "product",
            "id": "1"
          },
          {
            "type": "product",
            "id": "2"
          }
        ]
      }
    }
  }
}
  

Модель привязки .СЕТЕВОЙ сервер для публикации производителя выглядит следующим образом:

 public class CreateManufacturerBindingModel
    {
        public string Type { get; set; } = "manufacturer";
        public string Name { get; set; }
        public AssignProductBidingModel[] Products { get; set; }
    }

public class AssignProductBidingModel
    {
        public string Type { get; set; } = "product";
        public int Id { get; set; }
    }
  

Я некоторое время пробовал некоторые варианты этих кодов, и все, что я могу получить, это нулевые значения для атрибутов «Name» и «Products» CreateManufacturerBindingModel

Кто-нибудь имеет представление о том, почему я продолжаю получать нулевые значения в .СЕТЕВОЙ сервер?

Спасибо за ваше внимание!

Комментарии:

1. что ж, ваша модель должна иметь окружающий объект со свойством data , это может быть проблемой?

2. Предполагалось, что библиотека JSONAPISerializer @JSteward справится с этим за меня

3. @JSteward но я думаю, что мне не удалось настроить его правильно.

Ответ №1:

ASP.NET Ядро 3.1 будет использовать System.Text.Сериализаторы Json по умолчанию. Для JSONAPISerializer, который вы пытаетесь использовать, требуется Newtonsoft. Вы можете использовать Newtonsoft в проекте, установив следующий пакет nuget. (не используйте последнюю версию 5.0.0, так как для этого требуется net5.0)

 Install-Package Microsoft.AspNetCore.Mvc.NewtonsoftJson -Version 3.1.10`
  

Затем вы можете настроить сериализатор, как показано ниже. Это не позволяет вам заменять все SerizlierSettings , но JsonApiSerializerSettings только устанавливает несколько свойств, поэтому мы можем установить их напрямую

 public void ConfigureServices(IServiceCollection services)
{
    services.AddControllers().AddNewtonsoftJson(opts =>
    {
        opts.SerializerSettings.NullValueHandling = NullValueHandling.Ignore;
        opts.SerializerSettings.ReferenceLoopHandling = ReferenceLoopHandling.Serialize;
        opts.SerializerSettings.ContractResolver = new JsonApiContractResolver(new ResourceObjectConverter());
        opts.SerializerSettings.DateParseHandling = DateParseHandling.None;
    });
}
  

Наконец, вам нужно будет обновить свою модель, чтобы она содержала Id поле. Вот как JsonApiSerializer идентифицируются объекты ресурсов

 public class CreateManufacturerBindingModel
{
    public string Type { get; set; } = "manufacturer";

    // Need to have an ID property
    public string Id { get; set; }

    public string Name { get; set; }
    public AssignProductBidingModel[] Products { get; set; }
}
  

После этого он должен начать сериализацию и десериализацию ваших объектов как объектов JsonApi

Комментарии:

1. Работал очень хорошо! Большое тебе спасибо, @Alex!