2012-10-10 21 views
6

por lo que el followwing funciona bien, y me da un objeto JSON equipo de la cadena:usando newtonsoft, cómo deserializar sin saber el tipo hasta el tiempo de ejecución?

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

pero lo que si no voy a saber el tipo hasta el tiempo de ejecución? Digamos que tengo el json de cadena como el anterior, pero también tengo otra cadena con el nombre de tipo? por ejemplo, esto no está funcionando:

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

No se puede convertir objeto de tipo 'Newtonsoft.Json.Linq.JArray' a escribir ...

+0

Podría utilizar la versión de la plantilla? 'JsonConvert.DeserializeObject (json)' –

+0

No sé T hasta el tiempo de ejecución. Tengo una cuerda que me dice el tipo en el que deserializar. –

+0

Si tiene un JArray, no va a ser un objeto; es posible que necesite crear un Tipo de IEnumerable para su Tipo. –

Respuesta

6

Esto funcionó para mí:

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

El truco está en asegurarse de que type no sea nulo proporcionando el nombre de clase correcto. Si es así, la Deserialización aún puede funcionar, pero la salida no será del tipo que usted quiere. Consulte MSDN para obtener más información sobre GetType.

-3

crear un método Deserialize que toma un tipo genérico:

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

Entonces llamar así:

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 
} 
Cuestiones relacionadas