сериализация перечисления приводит к int

#c# #asp.net #serialization

Вопрос:

Когда я выполняю запрос GET для получения моего списка лиц, перечисления (заголовок) преобразуются в целые числа:

 
class Person {

public Title PersonTitle{ get; set;}
public string Name { get; set;}


}

enum Title {
   STUDENT,
   TEACHER,
   DIRECTOR
}
 

Допустим, у нас есть следующая ситуация:

 Person first = new Person(){
  PersonTitle = Title.STUDENT,
  Name = "Dave"
}
 

это приведет к следующему JSON:

 [
 {
   "Name" : "Dave",
   "PersonTitle" : 1,
 }
]
 

Как мне получить реальное значение перечисления (в данном случае STUDENT)?

Комментарии:

1. public Type { get; set;} вы что-то здесь упускаете??

2. Я забыл имя свойства, но это не проблема. Теперь он отредактирован

3. Перечисление — это целое число. Значение enum По умолчанию перечисления сериализуются как целые числа. Оба JSON.NET и System.Text. Json можно настроить для их сериализации, используя вместо этого их имена тегов. Какой из них вы используете? Для System.Text. Json проверяет перечисления как строки

4. Когда я выполняю запрос Get, мой метод отправляет список с этими людьми.

Ответ №1:

Единственный код, который нужно было изменить, был:

Перед :

 public enum Title {
   STUDENT,
   TEACHER,
   DIRECTOR
}
 

После :

 using using System.Text.Json.Serialization;
[JsonConverter(typeof(JsonStringEnumConverter))]
public enum Title {
   STUDENT,
   TEACHER,
   DIRECTOR
}

 

Теперь ответ выглядит так:

 
[
 {
   "Name" : "Dave",
   "PersonTitle" : "Student",
 }
]
 

Ответ №2:

Вам необходимо добавить соответствующий конвертер в сериализатор JSON.

System.Text.Json :

Json.NET :

Ответ №3:


вы можете установить атрибут JsonConverterAttribute

 class Person {

[JsonConverter(typeof(StringEnumConverter))]
public Title PersonTitle{ get; set;}
public string Name { get; set;}


}
 

Обновление перечисления с помощью EnumMemberAttribute

 enum Title {
   [EnumMember(Value = "Student")]
   STUDENT,
   [EnumMember(Value = "Teacher")]
   TEACHER,
   [EnumMember(Value = "Director")]
   DIRECTOR
}
 

Комментарии:

1. Я получаю: InvalidOperationException: преобразователь, указанный в MyClass. Человек. FileType’ не является производным от JsonConverter и не имеет общедоступного конструктора без параметров.

2. @schweppes0x Вы используете newtonsoft или System.Text?

3. Newtonsoft и я не уверен, почему, но теперь я не получаю никаких ошибок, но JSON по-прежнему неверен и по-прежнему отображает целые числа.

4. @schweppes0x: можете ли вы попробовать добавить EnumMember т.е [EnumMember(Value = "Student")]

5. но значение неизвестно, поэтому, возможно, значение — учитель, а не ученик