Атрибут JsonProperty работает некорректно с. NET Core 3.1, когда я использую символ подчеркивания - PullRequest
1 голос
/ 26 января 2020

У меня есть следующее JSON для запроса исправления:

{
    "idfa": "28A427FE-770B-4FA3-AA8E-123",
    "idfv": "11B3343C-ECBB-4CC8123B5BA-DDD9CA5768FD",
    "app_build_number": 1,
    "app_version": "1.0.0",
    "screen_height": 820,
    "screen_width": 300,
    "locale": "ru",
    "app_id": "com.hello",
    "app_platform": "iOS",
    "manufacturer": "Apple",
    "model": "iPhone10,6",
    "os_version": "12.3.1",
    "sdk_version": "0.3"
}

И следующая модель для сопоставления:

    public class CustomerChangeViewModel
    {
        [JsonProperty("idfa")]
        [Required(ErrorMessage = "Required idfa")]
        public string Idfa { get; set; }

        [JsonProperty("idfv")]
        [Required(ErrorMessage = "Required idfv")]
        public string Idfv { get; set; }

        [Required(ErrorMessage = "Required app_build_number")]
        [JsonProperty("app_build_number")]
        public string AppBuildNumber { get; set; }

        [JsonProperty("app_version")]
        [Required(ErrorMessage = "Required app_version")]
        public string AppVersion { get; set; }

        [JsonProperty("screen_height")]
        [Required(ErrorMessage = "Required screen_height")]
        public string ScreenHeight { get; set; }

        [JsonProperty("screen_width")]
        [Required(ErrorMessage = "Required width")]
        public string ScreenWidth { get; set; }

        [JsonProperty("locale")]
        [Required(ErrorMessage = "Required locale")]
        public string Locale { get; set; }

        [JsonProperty("app_id")]
        [Required(ErrorMessage = "Required app_id")]
        public string AppId { get; set; }

        [JsonProperty("app_platform")]
        [Required(ErrorMessage = "Required app_platform")]
        public string AppPlatform { get; set; }

        [JsonProperty("manufacturer")]
        [Required(ErrorMessage = "Required manufacturer")]
        public string Manufacturer { get; set; }

        [JsonProperty("model")]
        [Required(ErrorMessage = "Required model")]
        public string Model { get; set; }

        [JsonProperty("os_version")]
        [Required(ErrorMessage = "Required os_version")]
        public string OsVersion { get; set; }

        [JsonProperty("sdk_version")]
        [Required(ErrorMessage = "Required sdk_version")]
        public string SdkVersion { get; set; }
    }

И контроллер:

[Route("/api/v1.0/startup")]
[HttpPatch]
public async Task<IActionResult> Update([FromBody] CustomerChangeViewModel viewModel)
{
    ...
}

После отправки этого запроса у меня есть следующее: enter image description here

Как видите, не все поля были сопоставлены. Я думаю, что есть проблема с полями с символом "_". Есть идеи, почему это происходит? Я использую. NET Core 3.1 и Insomnia в качестве HTTP-клиента.

PS Я не уверен, что это необходимо, но мои настройки маршрутизации:

app.UseRouting();

app.UseEndpoints(endpoints =>
{
       endpoints.MapControllers();
});

Ответы [ 2 ]

4 голосов
/ 26 января 2020

Также вы можете использовать атрибут [JsonPropertyName("model")] вместо [JsonPropertyAttribute("model")], если вы хотите использовать собственный System.Text.Json для. net core 3.1

4 голосов
/ 26 января 2020

. NET Core 3. * по умолчанию использует System.Text.Json и не работает с JsonPropertyAttribute классом.

Вам необходимо установить Microsoft.AspNetCore.Mvc.NewtonsoftJson.

Install-Package Microsoft.AspNetCore.Mvc.NewtonsoftJson

И вызовите AddNewtonsoftJson метод расширения для установки ASP. NET Базовый проект для использования Newtonsoft.Json пакетов.

services.AddControllers().AddNewtonsoftJson();

Ссылки по теме

Использование Newtonsoft. Json In. NET Core 3+ Projects

...