Глобальная json опция сериализации в. Net Core 3.x - PullRequest
0 голосов
/ 25 февраля 2020

У меня есть. Net Core 3.1 Web Api. Я использую System.Text.Json сериализатор, так как он стал по умолчанию для. Net Core 3.x приложений. Я установил глобальное перечисление в строковый преобразователь следующим образом:

    public void ConfigureServices(IServiceCollection services)
    {
        ...
        services.AddControllers()
            .AddJsonOptions(options =>
                options.JsonSerializerOptions.Converters.Add(new JsonStringEnumConverter())));
        ... 
    }

Перечисления преобразуются в строку для ответов контроллера (что имеет смысл, поскольку я настраиваю метод AddControllers()). Но если я попытаюсь вручную сериализовать объект, он все равно сериализует enum как int. Пример ниже:

public class TestClass
{
    public void Test()
    {
        var data = JsonSerializer.Serialize(new MyObject { Enum1 = MyEnum.Value1, Enum2 = MyEnum.Value2 });
    }

    public class MyObject
    {
        public MyEnum Enum1 { get; set; }
        public MyEnum Enum2 { get; set; }
    }

    public enum MyEnum
    {
        Value1 = 1,
        Value2 = 2
    }   
}

ВЫХОД:

data [string]: "{\"Enum1\":1,\"Enum2\":2}"

Если я добавляю атрибут преобразования вручную, он сериализуется по желанию:

    public class MyObject
    {
        [JsonConverter(typeof(JsonStringEnumConverter))]
        public MyEnum Enum1 { get; set; }
        public MyEnum Enum2 { get; set; }
    }

OUTPUT

data [string]: "{\"Enum1\":\"Value1\",\"Enum2\":2}"

Есть ли способ установить глобальные опции сериализации json (перечисление в строку), которые также будут применяться для сериализации вручную?

Или, может быть, мне всегда следует придерживаться явных атрибутов?

Ответы [ 2 ]

0 голосов
/ 25 февраля 2020

Мне удалось заставить это работать, добавив NewtonsoftJson и затем зарегистрировав StringEnumConverter:

services
.AddControllers(jsonOptions => jsonOptions.ReturnHttpNotAcceptable = true)
.AddNewtonsoftJson(jsonOptions =>
                 {
                     jsonOptions.SerializerSettings.Converters.Add((JsonConverter) new StringEnumConverter());
                 }
0 голосов
/ 25 февраля 2020

В настоящее время вы не можете. JsonSerializer, являющийся классом stati c с только чисто методами c, параметры по умолчанию не могут быть установлены. Вы можете проверить этот открытый выпуск на Github . Похоже, что он был разработан таким образом, чтобы повысить производительность.

В качестве альтернативы, вы можете создать свои собственные stati c class

public static class CustomJsonSerializer
{
    private static JsonSerializerOptions serializerSettings =
        new JsonSerializerOptions { /* whatever you need */};

    public static T Deserialize<T>(this string json)
    {       
        return JsonSerializer.Deserialize<T>(json, serializerSettings );
    }
    // etc.
}
...