2016-08-03 11 views
1

Ich arbeite an Windows Phone 8.1-Anwendung. Ich arbeite mit der REST-API und die API gibt mir JSON-Daten zurück. Ich möchte eine Methode so erstellen, dass jedes Mal, wenn ich die API aufrufen, ich nur den Typ der Klasse, auf der es als Parameter deserialisiert werden soll, und ich die deserialisierten Daten in ein Objekt dieses Modells abrufen. Meine aktuellen Code sieht wie folgt aus:Deserialize JSON in verschiedene Klassen mit Reflection

public static async Task GetAPIData(Type referanceModel, string serviceUrl) 
    { 
     HttpClient client = new HttpClient(); 
     var responce = await client.GetAsync(new Uri(serviceUrl)); 
     JArray arr = JArray.Parse(await response.Content.ReadAsStringAsync()); 

     foreach (JObject obj in arr.Children<JObject>()) 
     { 
      JsonSerializerSettings settings = new JsonSerializerSettings(); 
      settings.NullValueHandling = NullValueHandling.Ignore; 
      settings.MissingMemberHandling = MissingMemberHandling.Ignore; 

      var rcvdData = JsonConvert.DeserializeObject<referanceModel>(obj.ToString(), settings); 


      //var method = typeof(JsonConvert).GetTypeInfo().GetDeclaredMethods("DeserializeObject").ToList()[5].MakeGenericMethod(ReferanceModel); 


      //var rcvd = method.Invoke(null, new object[] { obj.ToString(), settings }); 
     } 

    } 

Der obige Code zeigt mir den Fehler, dass referanceModel eine Variable ist. Ich habe den kommentierten Code auch ausprobiert, aber es funktioniert auch nicht.

Die zwei Klassen sind: AllvehData und AllDevicesData. Beiden Klassen sind in einer Singleton-Klasse genannt ThisUserClass mit der Instanz von thisuser

public class AllVehData 
{ 
    public string Colour { get; set; } 
    public string Make { get; set; } 
    public string model { get; set; } 
    public string Year { get; set; } 


} 


public class AllDevicesData 
{ 
    bool has_tracking_device { get; set; } 
    int drive_type_name_string_id { get; set; } 
    public int vehicle_status { get; set; } 
    public int cargo_capacity { get; set; } 
    public int fuel_capacity { get; set; } 
} 

ich viel über das Thema gesucht und gefunden this aber nicht verstehen. Ich brauche Hilfe.

Antwort

0

In diesem Fall benötigen Sie nicht die generische Überlast . Stattdessen verwenden Sie die JsonConvert.DeserializeObject(string, Type, JsonSerializerSettings) Überlastung und zu tun:

var rcvdData = JsonConvert.DeserializeObject(obj.ToString(), referanceModel, settings); 

Wenn Sie Generika - entweder Klasse oder Methode - Sie eine tatsächliche Art an der Stelle eines allgemeinen Parameters im Gegensatz einer Variable vom Typ Type passieren muss. Dies ist der Grund, warum Sie einen Kompilierzeitfehler erhalten. Z.B. um können Sie nicht tun, um eine Liste von Strings zu initialisieren:

var theStringVar = string.Empty; 
var myList1 = new List<theStringVar>(); // Here we get the compile time error. 

// OR 

var theTypeVar = typeof(string); 
var myList2 = new List<theTypeVar>(); // That won't work either. 

Stattdessen müssen Sie den string Typ explizit angeben:

var myList3 = new List<string>(); // This works just fine. 
+0

@BozhdarStoinev Könnten Sie mir bitte sagen, wie würde ich die Methode aufrufen. –

+0

Folgen Sie einfach dem Beispiel ... Welches Problem haben Sie? –

+0

Ich habe Ihren Code in den Json-Teil eingefügt. Das Problem ist, dass der Wert nicht in rcvdData aktualisiert wird. Das rcvdData wird ein Objekt der AllVehData-Klasse mit allen Nullwerten. –