2016-04-18 1 views
0

Ich versuche herauszufinden, wie eine JSON-Zeichenfolge in eine Enumeration deserialisiert wird. Im Moment nehme ich ein serialisiertes Dictionary, übergebe es an eine HttpPut-Methode und deserialisiere diese Zeichenfolge, um Felder in einem benutzerdefinierten Objekt mittels Reflektion zu aktualisieren. Hier ist, was ich bisher:JSON-String in eine Enumeration deserialisieren

ich Werte in das Wörterbuch wie folgt setzen:

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 

Ich bin mit JSON zu serialisiert ist wie folgt:

string jsonString = JsonConvert.SerializeObject(valuesToUpdate); 

ich dann nehmen jsonString und sendet es an einen REST-API-PUT-Aufruf. Mein Ziel dabei ist es, verschiedene Variablen für ein benutzerdefiniertes Objekt basierend auf den Schlüsselwerten im Wörterbuch mithilfe von Reflektion zu aktualisieren (in diesem Beispiel werde ich customObject.Confidence und customObject.Length aktualisieren).

Der PUT Anruf deserialisiert die jsonString wie folgt aus:

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

Mein Plan ist durch Newfields iterieren und verwenden Reflexion customObject die Felder zu aktualisieren. Im Moment habe ich einen Code, der funktioniert, wenn das Wörterbuch Strings oder Doubles findet, aber ich habe Probleme mit anderen Typen - hauptsächlich Enums und Klassen. Also, im Grunde, wie würde man eine serialisierte JSON-Dictionary-String nehmen, deserialize es in den entsprechenden Typ für die Reflexion? Mit dem Beispiel, das ich geschrieben habe, „Länge“ wird korrekt aktualisiert, sondern „Confidence“ wird diesen Fehler werfen:

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

Das ist mein HttpPut Methode, die die jsonString lautet:

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

es also scheint, dass es die ursprüngliche enum in Typ Int deserialisiert. Wie würde ich es erreichen, es als den ursprünglichen Typ von SimpleConfidence zu erkennen, der ein Enum ist?

Antwort

0

Die Typidentität der Enumeration SimpleConfidence ist zwischen Serialisierung und Deserialisierung verloren. Sie können es umpatchen, indem Sie eine spezielle Behandlung auf dem Zuordnungsbereich hinzufügen:

//... 

foreach(var field in newFields) 
{ 
    // ... 

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

    PropertyInfo propInfo = null; 

    // handles TEnum 
    if (propInfo.PropertyType.IsEnum) 
    { 
     propInfo.SetValue(customObject, Enum.ToObject(propInfo.PropertyType, field.Value), null); 
    } 
    // handles TEnum? 
    else if (Nullable.GetUnderlyingType(propInfo.PropertyType)?.IsEnum == true) 
    // if previous line dont compile, use the next 2 
    //else if (Nullable.GetUnderlyingType(propInfo.PropertyType) != null && 
    //   Nullable.GetUnderlyingType(propInfo.PropertyType).IsEnum) 
    { 
     propInfo.SetValue(customObject, Enum.ToObject(Nullable.GetUnderlyingType(propInfo.PropertyType), field.Value), null); 
    } 
    else 
    { 
     propInfo.SetValue(customObject, field.Value, null); 
    } 

} 
+0

Vielen Dank! Das funktioniert perfekt! – Roka545

+0

Wüssten Sie, wie Sie einen JSON-String auch in eine Klasse deserialisieren können? Ich habe dafür einen eigenen Beitrag erstellt: http://stackoverflow.com/questions/36728307/deserialize-json-string-into-class-with-reflection – Roka545

Verwandte Themen