2010-12-14 35 views
147

Uso felizmente el Newtonsoft JSON library. Por ejemplo me gustaría crear un JObject de un objeto .NET, en este caso un ejemplo de excepción (puede o no ser una subclase)Cómo deserializar un JObject al objeto .NET

if (result is Exception) 
    var jobjectInstance = JObject.FromObject(result); 

ahora sé la biblioteca puede deserializar texto JSON (es decir, una cadena de) a un objeto

// only works for text (string) 
Exception exception = JsonConvert.DeserializeObject<Exception>(jsontext); 

pero lo que estoy buscando es:

// now i do already have an JObject instance 
Exception exception = jobjectInstance.???? 

Bueno, está claro que puedo ir desde lo JObject volvemos al texto JSON y luego usamos la funcionalidad deserializar, pero eso me parece retroactivo.

Respuesta

279

De acuerdo con esta post, es mucho mejor ahora:

// pick out one album 
JObject jalbum = albums[0] as JObject; 

// Copy to a static Album instance 
Album album = jalbum.ToObject<Album>(); 

Documentación: Convert JSON to a Type

+9

¿Alguna idea sobre las implicaciones de rendimiento aquí? ¿La reflexión se usará todo el tiempo? –

+0

¿Es posible hacer esto con un JsonConverter personalizado? –

+1

Gracias por la pista. Me ayudó mucho. Déjame agregar algo: en un método genérico donde estoy usando el tipo 'T', requiero algo como' result = (value es JObject)? ((JObject) value) .ToObject (): (T) default (T); 'para convertirlo con éxito (note -' value' es un objeto procedente de una base de datos que podría ser un JObject o algo más, en cuyo caso el resultado debería ser nulo). – Matt

35

De la documentación que encontraron esta

JObject o = new JObject(
    new JProperty("Name", "John Smith"), 
    new JProperty("BirthDate", new DateTime(1983, 3, 20)) 
); 

JsonSerializer serializer = new JsonSerializer(); 
Person p = (Person)serializer.Deserialize(new JTokenReader(o), typeof(Person)); 

Console.WriteLine(p.Name); 

La definición de clase para Person debe ser compatible con lo siguiente:

class Person { 
    public string Name { get; internal set; } 
    public DateTime BirthDate { get; internal set; } 
} 

Editar

Si está utilizando una versión reciente de JSON.net y no necesitan serialización personalizada n, consulte la respuesta anterior de TienDo (o más abajo si me votó por votación positiva: P), que es más conciso.

+1

que necesitaba usar este enfoque, en lugar de la taquigrafía, para poder pasar a la configuración de serialización personalizado. –

Cuestiones relacionadas