2017-01-23 8 views
1

Я использую Json.NET, и я пытаюсь сохранить сопоставление словаря из перечисления в список других перечислений. Ключи перечисления предназначены для указания того, какой продукт и значение, отображаемое этим продуктом. Ключевое перечисление - это список перечислений, которые указывают, какие функции доступны под ним.Newtonsoft JSON словаря в список разных перечислений

Я думал о том, что тип перечисления в каждом списке значений зависит от того, к какому продукту они принадлежат.

У меня есть следующие классы:

public enum KeyEnum { 
    Key1, 
    Key2 
}  

public enum ValEnum1 { 
    Type1, 
    Type2 
}  

public enum ValEnum2 { 
    Type3, 
    Type4, 
    Type5, 
    Type6 
} 

class MyClass { 
    public Dictionary<KeyEnum, List<Enum>> Data { get; set; } 
} 

Я пытаюсь сделать

var tmp = new MyClass() 
{ 
    Data = new Dictionary<KeyEnum, List<Enum>>() 
    { 
     new List<Enum>() 
     { 
      ValEnum2.Type6 
     } 
    } 
} 

string newdata = JsonConvert.SerializeObject(tmp); 
var myClass = JsonConvert.DeserializeObject<MyClass>(newdata); 

Я получаю ошибку followering:

Newtonsoft.Json.JsonSerializationException: Error converting value 3 to type 'System.Enum'. Path 'Licenses.Audit[0]', line 1, position 160. ---> System.InvalidCastException: Unable to cast object of type 'System.Int64' to type 'System.Enum'. 

Я имею в виду, что я может просто преобразовать все перечисления в int вместо этого, но использование перечислений может быть лучше. Однако я не уверен, как правильно это сделать на C#.

+0

'Enum' - это тип в этом случае. Вы пытаетесь добавить ValEnum1 и ValEnum2 в этот список? Когда вы делаете наследование, я не думаю, что Enum - это ответ. – Thor

+0

Да, я должен был упомянуть, что Список значений будет либо List , либо List . Я отредактирую сообщение, чтобы включить его. Есть ли лучший подход, или я должен сделать некоторый базовый класс для всех «sub-Enum» для наследования? – thebenismightier

+0

Похоже, что это в основном дубликат [Deserialize specific enum в system.enum в Json.Net] (https://stackoverflow.com/questions/31351262). Или, может быть, это ближе: [Deserialize Dictionary <строка, объект> с значениями перечисления в C#] (https://stackoverflow.com/questions/38336390). Кто-нибудь из них отвечает на ваш вопрос или вам нужно что-то более конкретное? – dbc

ответ

0

Newtonsoft сериализует Enum по умолчанию на свое числовое значение. И тогда он понятия не имеет, как сериализовать это числовое значение обратно до Enum. Вы можете использовать атрибут на своем Enum, чтобы сериализовать их на строковое значение (чтобы ваш объект передачи данных был понятен), но для десериализации обратно к объекту, который вы должны реализовать, свой собственный JsonConverter.

Легче работать с более легко сериализуемыми типами данных.

+0

[Здесь] (http://bytefish.de/blog/enums_json_net/) - статья о том, как вы хотите спуститься по этой дороге. – Thor

+0

Спасибо, я думаю, что это применимо наилучшим образом для моей usecase, так как я не беспокоюсь о ограничениях памяти для хранения json с Enums как строки, и я все еще могу использовать стандартные Enums в наших приложениях. – thebenismightier

 Смежные вопросы

  • Нет связанных вопросов^_^