将JSON字符串反序列化为枚举

时间:2016-04-18 20:09:54

标签: c# json enums deserialization http-put

我正在试图弄清楚如何将JSON字符串反序列化为枚举。现在我正在使用序列化的Dictionary,将其传递给HttpPut方法,并反序列化该字符串,以便使用反射更新自定义对象上的字段。这是我到目前为止所做的:

我正在将值放入字典中:

  Dictionary<string, object> valuesToUpdate = new Dictionary<string, object>();
  valuesToUpdate.Add("Length", 64.0); //Length is a double
  valuesToUpdate.Add("Confidence", SimpleConfidence.THREE); //Confidence is an enum

我正在使用JSON进行序列化是这样的:

string jsonString = JsonConvert.SerializeObject(valuesToUpdate);

然后我接受jsonString并将其发送到REST API PUT调用。我的目标是使用反射基于字典中的Key值更新自定义对象的各种变量(在本例中我将更新customObject.Confidence和customObject.Length)。

PUT调用反序列化jsonString,如下所示:

Dictionary<string, object> newFields = JsonConvert.DeserializeObject<Dictionary<string, object>>(jsonString);

我的计划是遍历newFields并使用反射来更新customObject的字段。现在我有一些代码可以在字典找到字符串或双精度时工作,但我遇到其他类型的问题 - 主要是枚举和类。基本上,如何采用序列化的json字典字符串,将其反序列化为适当的反射类型?通过我发布的示例,“长度”将正确更新,但“置信度”将抛出此错误:

Object of type 'System.Int64' cannot be converted to type 'System.Nullable'1.

这是我的HttpPut方法,它读取jsonString:

[HttpPut("/test/stuff")]
public string PutContact([FromBody]dynamic jsonString)
{
        Dictionary<string, object> newFields = JsonConvert.DeserializeObject<Dictionary<string, object>>(jsonString);
        foreach(var field in newFields)
        {
            Console.WriteLine("\nField key: " + field.Key);
            Console.WriteLine("Field value: " + field.Value + "\n");

            PropertyInfo propInfo = typeof(CustomObject).GetProperty(field.Key);
            var value = propInfo.GetValue(customObject, null);
            propInfo.SetValue(customObject, field.Value, null);
        }
}

所以似乎喜欢将原始枚举反序列化为Int64类型。我如何才能将它识别为SimpleConfidence的原始类型,这是一个枚举?

1 个答案:

答案 0 :(得分:0)

序列化和反序列化之间遗失了枚举{​​{1}}的类型标识。你可以通过在赋值部分添加一些特殊处理来修补它:

SimpleConfidence