Сериализация значений и имен Enum в JSON - PullRequest
0 голосов
/ 13 января 2019

Этот вопрос связан, но ИМХО не идентичен

Во время тестирования я также наткнулся на этого преступника LinqPad, который осложнил мою жизнь: Почему LINQPad выводит целочисленные значения enum в виде строк?

Теперь мой актуальный вопрос: Мое приложение (в частности источники данных компонентов SyncFusion, такие как MultiSelect) требует перечисления в формате JSON, например, как то так:

[ {"Id":0,"Name":"Unknown"},{"Id":1,"Name":"Open"},{"Id":2,"Name":"Closed"},{"Id":3,"Name":"Approve"} ]

UPDATE Как указал dbc, мой вопрос мог быть недостаточно ясным. Я не хочу сериализовать одну запись перечисления, но всю структуру. Затем JSON можно использовать для источника данных в Javascript, например, для упрощенного: <option value=0>Unknown</option> <option value=1>Open</option> etc

Объект JSON идентичен Enum в пространстве имен (за исключением того, что я дал имя свойства ключу и значению каждой записи:

public enum ListOptions
{
    Unknown = 0,
    Open = 1,
    Closed = 2,
    Approve = 3
}

Я боролся с Enums, все другие подходы, такие как указание Json StringConverter и т. Д., Не дали всех опций в массиве, поэтому я в конечном итоге использовал Linq. Моя модель просмотра теперь имеет строковое свойство, подобное этому:

public string CrewListOption => JsonConvert.SerializeObject(Enum.GetValues(typeof(ListOptions))
        .Cast<int>()
        .Select(e => new { Id = (int)  e, Name = typeof(ListOptions).GetEnumName(e) }));

Учитывая, что я в значительной степени новичок в ASP.Net Core, мне трудно поверить, что это должно быть хорошим решением. И все же мне трудно найти лучшие примеры того же самого.

Я был бы признателен, если бы вы могли помочь мне улучшить это и сделать его потенциально более полезным для «экспорта» целых перечислений в JSON.

Вот полный LinqPad (куда Newtonsoft.Json импортируется из GAC):

void Main()
{   
    Enum.GetValues(typeof(ListOptions)).Cast<int>().Select(e => new { Id = e, Name = (ListOptions) e } ).Dump(); // these are identical, except for the typeof()
    Enum.GetValues(typeof(ListOptions)).Cast<int>().Select(e => new { Id = (int)  e, Name = typeof(ListOptions).GetEnumName(e) }).Dump(); // is typeof(MyEnumType) better?
    string JsonString = JsonConvert.SerializeObject(Enum.GetValues(typeof(ListOptions)).Cast<int>().Select(e => new { Id = (int)  e, Name = typeof(ListOptions).GetEnumName(e) }));
    JsonString.Dump(); // [{"Id":0,"Name":"Unknown"},{"Id":1,"Name":"Open"},{"Id":2,"Name":"Closed"},{"Id":3,"Name":"Approve"}]
}

public enum ListOptions { 
    Unknown = 0,
    Open = 1,
    Closed = 2,
    Approve = 3 
};

Ответы [ 2 ]

0 голосов
/ 13 января 2019

Вот пример из документов Microsoft, которые преобразуют Enum в словарь

https://docs.microsoft.com/en-us/dotnet/csharp/programming-guide/generics/constraints-on-type-parameters#enum-constraints

Затем вы можете сериализовать словарь в JSON.

0 голосов
/ 13 января 2019

У вас может быть статический метод, такой как

public static EnumToDictionary<string, string> EnumToDictionary<T>() where T: Enum
{
    var res = Enum.GetValues(typeof(T)).Cast<T>()
        .ToDictionary(e => Convert.ToInt32(e).ToString(), e => e.ToString());

    return res;
}

затем для сериализации как объекта

var enumValues=  EnumToDictionary<ListOptions>();
var result = JsonConvert.SerializeObject(enumValues);

для сериализации в виде массива

var enumValues=  EnumToDictionary<ListOptions>().ToArray();
var result = JsonConvert.SerializeObject(enumValues);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...