字典的Newtonsoft JSON列出了不同的枚举

时间:2017-01-23 17:51:32

标签: c# enums json.net

我正在使用Json.NET,我正在尝试将字典映射从枚举存储到其他枚举列表。枚举键用于指示哪个产品,以及该产品映射到的值Key enum是一个枚举列表,用于指示其下可用的功能。

我在考虑让每个值列表中的枚举类型取决于它们属于哪个产品。

我有以下课程:

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);

我收到了以下错误:

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#中正确执行此操作。

1 个答案:

答案 0 :(得分:0)

Newtonsoft序列化public String everyNth(String str, int n) { if (n < 1) { throw new IllegalArgumentException("n must be greater than 0"); } StringBuilder result = new StringBuilder(); // The index of the previous match int previous = 0; for (int i = n-1; i < str.length(); i += n) { // Add substring from previous match to the current result.append(str, previous, i); // Set the new value of previous previous = i + 1; } // Add the remaining sub string result.append(str, previous, str.length()); return result.toString(); } 默认为其数值。然后它不知道如何将该数值序列化回Enum。您可以使用Enum上的属性将它们序列化为字符串值(以便您的数据传输对象可以理解),但要反序列化为对象,您必须实现自己的Enum

使用更易于序列化的数据类型更容易。