2010-12-14 24 views
147

Uso felicemente lo Newtonsoft JSON library. Per esempio vorrei creare un JObject da un oggetto .NET, in questo caso un'istanza di eccezione (potrebbe o non potrebbe essere una sottoclasse)Come deserializzare un oggetto JObject su .NET

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

Ora conosco la libreria può deserializzare testo JSON (cioè una stringa) a un oggetto

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

ma quello che sto cercando è:

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

Beh, è ​​chiaro che io posso andare da sulla JObject di nuovo al testo JSON e quindi utilizzare la funzionalità deserialize, ma che sembra indietro per me.

risposta

279

Secondo questa post, è molto meglio ora:

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

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

Documentazione: Convert JSON to a Type

+9

Qualche idea sulle implicazioni di performance qui? La riflessione sarà usata ogni volta? –

+0

È possibile farlo con un JsonConverter personalizzato? –

+1

Grazie per il suggerimento. Mi ha aiutato molto. Lasciatemi aggiungere qualcosa: in un metodo generico in cui sto usando il tipo 'T', ho richiesto qualcosa come' risultato = (valore è JObject)? ((JObject) value) .ToObject (): (T) default (T); 'per convertirlo con successo (nota -' value' è un oggetto proveniente da un database che potrebbe essere un JObject o qualcos'altro nel qual caso risultato dovrebbe essere nullo). – Matt

35

Dalla documentazione ho trovato questo

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 definizione di classe per Person dovrebbe essere compatibile con il seguente:

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

Modifica

Se si utilizza una versione recente di JSON.net e non hanno bisogno di serializatio personalizzato n, per favore vedi la risposta di TienDo sopra (o sotto se mi inviti: P), che è più conciso.

+1

avevo bisogno di usare questo approccio, piuttosto che la stenografia, per essere in grado di passare le impostazioni di serializzazione personalizzata. –

Problemi correlati