StringEnumConverter работает как атрибут, но не глобально

Мы внедряем API .NET Core 3.1 и используем Microsoft.AspNetCore.Mvc.NewtonsoftJson в соответствии с этот документ. Мы имеем дело с перечислениями, и нам нужно строковое представление вместо целых чисел. Мы делаем это, используя атрибут JsonConverter следующим образом:

[JsonProperty("region")]
[JsonConverter(typeof(StringEnumConverter))]
public Region Region { get; set; }

Мы пытаемся сделать это глобально из Startup.cs, как показано ниже:

services.AddControllers().AddNewtonsoftJson(opts => opts.SerializerSettings.Converters.Add(new StringEnumConverter()));

Если мы это сделаем, Cosmos DB жалуется на

PartitionKey, извлеченный из документа, не соответствует указанному в заголовке

Поэтому мы попытались удалить все атрибуты, кроме атрибута региона. Все остальные перечисления, у которых нет атрибута, правильно сохраняются в виде строк, но для работы региона по-прежнему требуется атрибут. Любая подсказка, почему это происходит и как это решить?


person user33276346    schedule 29.06.2020    source источник
comment
AddNewtonsoftJson() влияет только на поведение по умолчанию сериализации JSON ядра asp.net и привязки модели, но не влияет на поведение автономного Json.NET или других приложений. Чтобы сделать это, см. раздел Установка глобальных настроек сериализатора json по умолчанию.   -  person dbc    schedule 29.06.2020
comment
Это предполагает, что CosmosDB использует глобальные настройки Json.NET. (Если вы вручную создаете сериализатор, используя JsonSerializer.Create() вместо JsonSerializer.CreateDefault() глобального значения по умолчанию игнорируются.) Не могли бы вы отредактировать свой вопрос, чтобы поделиться минимальный воспроизводимый пример, показывающий, как сгенерировать ошибку Cosmos DB?   -  person dbc    schedule 29.06.2020
comment
Было бы обременительно делиться кодом, и это одна из причин проблемы, которую вы помогли мне понять. У меня есть .NET Core API, поэтому я не вижу, как настроить автономный Json.NET на более высоком уровне, чем Startup. ОДНАКО, я понял, что атрибуты используются в классах из другого проекта ????‍♂️. Я планирую в эти выходные добавить это объяснение в качестве ответа, чтобы, возможно, помочь другим обратить на это внимание, если только вы не сможете дать больше информации. Спасибо дбк!   -  person user33276346    schedule 30.06.2020


Ответы (1)


В netcore 3.1 или выше вы можете использовать JsonStringEnumConverter:

 var options = new JsonSerializerOptions
        {            
            Converters = { new JsonStringEnumConverter() },
             //other options
        };

Попробуйте Пример онлайн

person M.Hassan    schedule 18.11.2020