parsing jested annidato con json.net

Ho problemi con la deserializzazione di JSON, sotto c’è il mio json

{ "_id" : ObjectId("56bc28c436b252c406a67f17"), "empname": "dhiraj", "empcode": "123a", "level": { "levelID": 3, "levelDescription": "manager", "levelCode": "mg" }, "Address": [ { "Home": { "streetname": "Home", "city": "bbb", "state": "aaa" } }, { "Office": { "streetname": "ofc", "city": "ccc", "state": "ddd" } } ] } 

E per quanto riguarda sopra, le classi object sono simili

 public class Employee { public ObjectId _id { get; private set; } public string empname { get; set; } public string empcode { get; set; } public List level { get; set; } public List
Address { get; set; } } public class level { public string levelID { get; set; } public string levelDescription { get; set; } public string levelCode { get; set; } } public class Address { public List Home { get; set; } public List Office { get; set; } } public class Home { public string streetname { get; set; } public string city { get; set; } public string state { get; set; } } public class office { public string streetname { get; set; } public string city { get; set; } public string state { get; set; } }

ho provato a deserializzare usando sotto il codice

 Employee empobj = Newtonsoft.Json.JsonConvert.DeserializeObject<List>(jsonData); 

ma ho ricevuto un errore come

 Cannot deserialize the current JSON object (eg {"name":"value"}) into type 'System.Collections.Generic.List' because the type requires a JSON array (eg [1,2,3]) to deserialize correctly. 

Come posso aggiustarlo? C’è un modo, il risultato JSON proviene da mongodb c # query.

Ci sono diversi problemi qui:

  • Il codice che hai fornito non verrà compilato, come hai specificato una class chiamata level ma usata come Level
  • Stai tentando di deserializzare un List , ma il tuo JSON specifica solo un singolo object Employee ; non è la stessa cosa di un array di oggetti contenenti un singolo object
  • Il tuo JSON non è valido – ObjectId("56bc28c436b252c406a67f17") semplicemente non è un valore valido in JSON. Potrebbe essere che Json.NET abbia qualche supporto per questa stranezza, ma sarebbe meglio se potessi usare JSON valido
  • La class Address specifica un List per la proprietà Home e allo stesso modo per la proprietà Office , ma ancora il JSON specifica solo un valore object, non un array. Allo stesso modo per la proprietà di level .

Inoltre, il fatto che tu abbia classi separate per Home e Office è piuttosto sgradevole, così come lo è la combinazione di convenzioni di denominazione. La struttura JSON degli indirizzi è lontana dall’ideale, ma suppongo che non si possa risolvere il problema.

Non riesco a risolvere il problema ObjectId , ma strutturerei le classi come:

 public class Employee { [JsonProperty("_id")] public ObjectId Id { get; private set; } [JsonProperty("empname")] public string Name { get; set; } [JsonProperty("empcode")] public string Code { get; set; } [JsonProperty("level")] public Level Level { get; set; } [JsonProperty("Address")] public List
Addresses { get; set; } } public class Level { [JsonProperty("levelID")] public string Id { get; set; } [JsonProperty("levelDescription")] public string Description { get; set; } [JsonProperty("levelCode")] public string Code { get; set; } } // This structure is unfortunate, but imposed by the JSON public class Address { [JsonProperty("Home")] public StreetAddress Home { get; set; } [JsonProperty("Office")] public StreetAddress Office { get; set; } } public class StreetAddress { [JsonProperty("streetname")] public string StreetName { get; set; } [JsonProperty("city")] public string City { get; set; } [JsonProperty("state")] public string State { get; set; } }

A parte ObjectId , questo analizzerà il JSON che hai dato usando:

 var employee = JsonConvert.DeserializeObject(json);