14

JavaScriptSerializer - Сериализация JSON перечислений в виде строк

11

У меня есть класс, который содержит свойство типа enum, и при сериализации объекта с использованием JavaScriptSerializer, результат в формате JSON содержит целочисленное значение перечисления, а не его строковое "имя". Есть ли способ получить значение перечисления в виде строки в JSON без создания пользовательского JavaScriptConverter? Возможно, есть атрибут, которым можно украсить определение enum или свойство объекта?

Вот пример:

enum Gender { Male, Female }

class Person
{
    int Age { get; set; }
    Gender Gender { get; set; }
}

Желаемый результат в формате JSON:

{ "Age": 35, "Gender": "Male" }

Я бы предпочел ответ с использованием встроенных классов .NET Framework, но альтернативы (например, Json.net) тоже приветствуются.

5 ответ(ов)

1

Чтобы обеспечить сериализацию C# перечислений (enum) в формате строки при работе с JSON, добавьте следующий код в файл global.asax вашего проекта:

HttpConfiguration config = GlobalConfiguration.Configuration;
config.Formatters.JsonFormatter.SerializerSettings.Formatting =
    Newtonsoft.Json.Formatting.Indented;

config.Formatters.JsonFormatter.SerializerSettings.Converters.Add
    (new Newtonsoft.Json.Converters.StringEnumConverter());

Этот код настроит сериализатор JSON так, чтобы он использовал StringEnumConverter, что позволит сериализовать все перечисления как строки вместо их числовых значений. Не забудьте добавить соответствующие using для работы с HttpConfiguration и Newtonsoft.Json.

0

Я не смог изменить исходную модель, как в верхнем ответе (@ob.), и не хотел регистрировать её глобально, как это сделал @Iggy. Поэтому я объединил решения из этого ответа и ответа @Iggy здесь, чтобы установить конвертер строкового перечисления непосредственно во время вызова команды SerializeObject:

Newtonsoft.Json.JsonConvert.SerializeObject(
    objectToSerialize, 
    Newtonsoft.Json.Formatting.None, 
    new Newtonsoft.Json.JsonSerializerSettings()
    {
        Converters = new List<Newtonsoft.Json.JsonConverter> {
            new Newtonsoft.Json.Converters.StringEnumConverter()
        }
    })

Таким образом, я смог обрабатывать перечисления в виде строк непосредственно при сериализации объекта.

0

Комбинация ответов Омера Бокари и uri всегда является моим решением, поскольку значения, которые я хочу предоставить, обычно отличаются от того, что у меня в перечислении, особенно учитывая, что я хотел бы иметь возможность изменять свои перечисления при необходимости.

Если кому-то это интересно, вот как это выглядит:

public enum Gender
{
   [EnumMember(Value = "male")] 
   Male,
   [EnumMember(Value = "female")] 
   Female
}

class Person
{
    int Age { get; set; }
    [JsonConverter(typeof(StringEnumConverter))]
    Gender Gender { get; set; }
}
0

Для настройки сериализации перечислений в формате строк в ASP.NET Core, можно воспользоваться следующим подходом. Вам нужно добавить конвертер для перечислений в методе ConfigureServices класса Startup. Вот пример кода:

public class Startup
{
    public IServiceProvider ConfigureServices(IServiceCollection services)
    {
        services.AddMvc().AddJsonOptions(options =>
        {
            options.JsonSerializerOptions.Converters.Add(new System.Text.Json.Serialization.JsonStringEnumConverter());
        });

        // Другие настройки сервисов

        return services.BuildServiceProvider();
    }
}

В этом примере мы используем JsonStringEnumConverter, который является частью System.Text.Json. Он позволяет сериализовать перечисления как строки в JSON-ответах. Убедитесь, что вы добавили пространство имен для использования System.Text.Json.Serialization.

Если же вы используете Newtonsoft.Json, то можно использовать следующий код:

public class Startup
{
    public IServiceProvider ConfigureServices(IServiceCollection services)
    {
        services.AddMvc()
            .AddNewtonsoftJson(options =>
            {
                options.SerializerSettings.Converters.Add(new Newtonsoft.Json.Converters.StringEnumConverter());
            });

        // Другие настройки сервисов

        return services.BuildServiceProvider();
    }
}

Выбор между System.Text.Json и Newtonsoft.Json зависит от ваших предпочтений и требований проекта. Обе библиотеки поддерживают работу с перечислениями в виде строк. Если у вас возникнут дополнительные вопросы, не стесняйтесь их задавать!

0

В вашем коде вы правильно настраиваете System.Text.Json для обработки перечислений как строки в ASP.NET Core 3. Использование JsonStringEnumConverter позволяет сериализовать и десериализовать перечисления в формат строк, что может быть полезно для повышения читабельности JSON-ответов и обеспечения совместимости с фронтенд-приложениями, которые ожидают строковые значения.

Вот краткое объяснение вашего кода:

public void ConfigureServices(IServiceCollection services)
{
    services
        .AddControllers() // Добавляет контроллеры в контейнер сервисов
        .AddJsonOptions(options => // Конфигурирует параметры JSON сериализации
            options.JsonSerializerOptions.Converters.Add(new JsonStringEnumConverter()) // Добавляет конвертер для перечислений
        );

    //...
}

Таким образом, при использовании этого конвертера ваши перечисления будут сериализоваться в строки, например, вместо 1 или 0 вы получите "Active" или "Inactive". Это делает JSON-ответы более понятными и удобочитаемыми.

Если у вас возникли дополнительные вопросы или требуется подробная информация о других возможностях настройки JSON-сериализации, не стесняйтесь спрашивать!

Чтобы ответить на вопрос, пожалуйста, войдите или зарегистрируйтесь