2010-12-14 9 views
147

J'utilise volontiers le Newtonsoft JSON library. Par exemple, je voudrais créer un JObject à partir d'un objet .NET, dans ce cas, une instance d'exception (peut ou non être une sous-classe)Comment désérialiser un objet JObject en .NET

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

maintenant je sais que la bibliothèque peut désérialiser texte JSON (par exemple une chaîne) à un objet

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

mais ce que je cherche est:

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

Eh bien, il est clair que je peux partir sur JObject retour au texte JSON et ensuite utiliser la fonctionnalité de désérialisation, mais cela semble à l'envers pour moi.

Répondre

279

Selon cette post, il est beaucoup mieux maintenant:

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

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

Documentation: Convert JSON to a Type

+9

Des idées sur les implications de performance ici? La réflexion sera-t-elle utilisée à chaque fois? –

+0

Est-il possible de faire cela avec un JsonConverter personnalisé? –

+1

Merci pour l'indice. Cela m'a beaucoup aidé. Permettez-moi d'ajouter quelque chose: Dans une méthode générique où j'utilise le type 'T', j'ai demandé quelque chose comme' result = (value is JObject)? ((JObject) value) .ToObject (): (T) default (T); 'pour le convertir avec succès (note -' value' est un objet provenant d'une base de données qui peut être un objet JObject ou autre dans quel cas devrait être nul). – Matt

35

De la documentation que je trouve cette

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 définition de classe pour Person doit être compatible avec les éléments suivants:

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

Modifier

Si vous utilisez une version récente de JSON.net et n'ont pas besoin de sérialisation personnalisée n, s'il vous plaît voir la réponse de TienDo ci-dessus (ou ci-dessous si vous me upvote: P), ce qui est plus concis.

+1

que je devais utiliser cette approche, plutôt que le raccourci, pour pouvoir passer les paramètres de sérialisation personnalisés. –

Questions connexes