Deserializzazione di JSON in un object con Json.NET

Sto giocando un po ‘con la nuova API StackOverflow . Sfortunatamente, il mio JSON è un po ‘debole, quindi ho bisogno di aiuto.

Sto cercando di deserializzare questo JSON di un utente:

{"user":{ "user_id": 1, "user_type": "moderator", "creation_date": 1217514151, "display_name": "Jeff Atwood", ... "accept_rate": 100 }} 

in un object che ho decorato con JsonProperty attributi di JsonProperty :

 [JsonObject(MemberSerialization.OptIn)] public class User { [JsonProperty("user_id", Required = Required.Always)] public virtual long UserId { get; set; } [JsonProperty("display_name", Required = Required.Always)] public virtual string Name { get; set; } ... } 

Ottengo la seguente eccezione:

Newtonsoft.Json.JsonSerializationException: proprietà richiesta ‘user_id’ non trovata in JSON.

Questo perché l’object JSON è un array? In tal caso, come posso deserializzarlo sull’unico object Utente?

Grazie in anticipo!

Come ha detto Alexandre Jasmin nei commenti della tua domanda, il JSON risultante ha un wrapper attorno all’object User che stai tentando di deserializzare.

Un work-around avrebbe detto la class wrapper:

 public class UserResults { public User user { get; set; } } 

Quindi la deserializzazione funzionerà:

 using (var sr = new StringReader(json)) using (var jr = new JsonTextReader(sr)) { var js = new JsonSerializer(); var u = js.Deserialize(jr); Console.WriteLine(u.user.display_name); } 

Ci saranno future proprietà dei metadati su questo wrapper, ad esempio il timestamp di risposta, quindi non è una ctriggers idea usarlo!

Se non vuoi creare una class wrapper puoi anche accedere all’Utente in questo modo:

 String jsonString = "{\"user\":{\"user_id\": 1, \"user_type\": \"moderat..."; JToken root = JObject.Parse(jsonString); JToken user = root["user"]; User deserializedUser = JsonConvert.DeserializeObject(user.ToString()); 

Vedi questa pagina nel documento Json.NET per i dettagli.

Simile alla risposta di @Alexandre Jasmin, è ansible utilizzare un intermediario JsonSerializer per convertire anziché utilizzare il JsonConvert alto livello su .ToString() . Non ho idea se sia più efficiente …

Riferimenti:

Esempio:

 var root = JObject.Parse(jsonString); var serializer = new JsonSerializer(); var expectedUserObject = serializer.Deserialize(root["user"].CreateReader());