JavaScriptSerializer - Сериализация JSON перечислений в виде строк
У меня есть класс, который содержит свойство типа 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 ответ(ов)
Чтобы обеспечить сериализацию 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
.
Я не смог изменить исходную модель, как в верхнем ответе (@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()
}
})
Таким образом, я смог обрабатывать перечисления в виде строк непосредственно при сериализации объекта.
Комбинация ответов Омера Бокари и 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; }
}
Для настройки сериализации перечислений в формате строк в 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
зависит от ваших предпочтений и требований проекта. Обе библиотеки поддерживают работу с перечислениями в виде строк. Если у вас возникнут дополнительные вопросы, не стесняйтесь их задавать!
В вашем коде вы правильно настраиваете 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-сериализации, не стесняйтесь спрашивать!
Если папка не существует, создайте её
Как установить заголовок Content-Type для запроса HttpClient?
Запрос Ajax возвращает 200 OK, но вместо успеха срабатывает событие ошибки
Сравнение членов enum в Java: использовать == или equals()?
Как вывести циклическую структуру в формате, похожем на JSON?