2012-10-10 5 views
6

so funktioniert das followwing ganz gut, mir ein Team-Objekt aus dem String json geben:mit newtonsoft, wie ohne zu wissen, die Art bis zur Laufzeit deserialisieren?

var found = JsonConvert.DeserializeObject<Team>(json); 

aber was ist, wenn ich nicht die Art erst zur Laufzeit wissen? Angenommen, ich habe die Zeichenfolge json wie oben, aber ich habe auch eine andere Zeichenfolge mit dem Typnamen? beispielsweise ist dies nicht funktioniert:

var found = JsonConvert.DeserializeObject(json, Type.GetType("Team")); 

Kann nicht das Objekt des Typs 'Newtonsoft.Json.Linq.JArray' werfen ... Das ist für mich

+0

Könnten Sie die Template-Version verwenden? 'JsonConvert.DeserializeObject (json)' –

+0

Ich weiß, T nicht erst zur Laufzeit. Ich habe eine Zeichenkette, die mir den zu deserialisierenden Typ angibt. –

+0

Wenn Sie eine JArray haben, ist es kein Objekt sein würde - Sie eine IEnumerable Typ für Ihre Art bauen benötigen. –

Antwort

6

eingeben:

var type = Type.GetType("My.Namespace.Class"); 
var myObj = JsonConvert.DeserializeObject(item, type); 

Der Trick ist, um sicherzustellen, dass type durch die Eingabe der richtigen Klassennamen nicht null ist. Wenn dies der Fall ist, kann die Deserialisierung immer noch funktionieren, aber die Ausgabe ist nicht der Typ, den Sie möchten. Siehe MSDN für weitere Informationen auf GetType.

-3

eine Deserialize Methode erstellen, die einen generischen Typ nimmt:

public T Deserialize<T>(string obj) where T : class 
{ 
    return JsonConvert.DeserializeObject<T>(obj); 
} 

es dann nennen wie:

public class Person 
{ 
    public string FirstName { get; set; } 
    public string LastName { get; set; } 
} 

static void Main(string[] args) 
{ 
    string json = "{ "Person": { "FirstName": "Scott", "LastName": "Lance"}}"; 
    var person = Deserialize<Person>(json); 

    // Do whatever with the person object 
} 
Verwandte Themen