2017-06-27 5 views
1

In meiner App habe ich Antworten von einem Server. Diese Antworten können sein:C# Klassenname basierend auf Variable

{ 
    "cmd":"read_ack", 
    "model":"sensor_ht", 
    "sid":"158d0001a2ddac", 
    "short_id":36192, 
    "data":"{\"voltage\":3005,\"temperature\":\"2741\",\"humidity\":\"5828\"}" 
} 

Oder es kann sein:

{ 
    "cmd":"read_ack", 
    "model":"magnet", 
    "sid":"158d000159febe", 
    "short_id":40805, 
    "data":"{\"voltage\":3045,\"status\":\"open\"}" 
} 

Kann ich so etwas wie "dynamisch" Klasse?

Meine Klasse sieht wie folgt aus:

public class RootObject 
    { 
     public string cmd { get; set; } 
     public string model { get; set; } 
     public string sid { get; set; } 
     public int short_id { get; set; } 
     public Data data { get; set; } 
    } 

Und meine Datenklasse wie folgt aussieht:

public class Data 
    { 
     [JsonProperty(NullValueHandling = NullValueHandling.Ignore)] 
     public int voltage { get; set; } 
     [JsonProperty(NullValueHandling = NullValueHandling.Ignore)] 
     public string status { get; set; } 
     [JsonProperty(NullValueHandling = NullValueHandling.Ignore)] 
     public string temperature { get; set; } 
     [JsonProperty(NullValueHandling = NullValueHandling.Ignore)] 
     public string humidity { get; set; } 
     [JsonProperty(NullValueHandling = NullValueHandling.Ignore)] 
     public string no_close { get; set; } 
     [JsonProperty(NullValueHandling = NullValueHandling.Ignore)] 
     public string no_motion { get; set; } 
    } 

Ist es möglich, verschiedene Klassen für jede Art von Reaktion auf habe ich bekommen? Ist es möglich, den Datentyp in der RootObject-Klasse dynamisch zu ändern?

Vielen eine Menge

+1

Versuchen Sie Vererbung (ich denke, das ist, was Sie wollen). Wenn alle Ihre Klassen das Zeug in RootObject benötigen, lassen Sie sie davon erben. Siehe https://docs.microsoft.com/en-us/dotnet/csharp/tutorials/inheritance –

+3

https://stackoverflow.com/questions/20432166/how-to- deserialize-a-json-property-that-can -be-zwei-verschiedene-Datentypen-using-js – CodeCaster

Antwort

0

Sie werden einen benutzerdefinierten Konverter benötigen, wie in How to deserialize a JSON property that can be two different data types using Json.NET und Vererbung erklärt den Datentyp zu ändern.

Man könnte es mit einem leeren Basisklasse Ansatz, der mehr abgeleiteten Typen implementieren:

public class RootObject 
{ 
    public string cmd { get; set; } 
    public string model { get; set; } 
    public string sid { get; set; } 
    public int short_id { get; set; } 
    public SensorData data { get; set; } 
} 

public abstract class SensorData 
{  
} 

public class MagnetData : SensorData 
{ 
    public int Voltage { get; set; } 
} 

public class SomeOtherSensorData : SensorData 
{ 
    public bool AnotherProperty { get; set; } 
} 

Und dann in Ihrem Konverter, entweder deserialisieren in eine MagnetData oder SomeOtherSensorData oder was auch immer andere Klassen, die Sie wollen.

Das bedeutet, dass Sie tatsächlich eine Klasse pro Datentyp erstellen möchten. Es gibt Vor- und Nachteile.

Alternativ, einfach deserialize Ihre data in eine Dictionary<string, object>, wo Sie die relevanten Felder durch ihre (String) Name herausziehen.

+0

Danke, es funktioniert. Mein Hauptprogramm verwendet jedoch den Typ innerhalb einer Klasse, um Dokumentation für die Funktion zu erstellen. Es ist also leer, weil SensorData leer ist. Aber ich denke, es gibt keine Lösung für dieses kleine Problem. – Hydro

Verwandte Themen