Comment désérialiser ce JSON dans un object?

J’essaie d’utiliser JSON.Net pour désérialiser un object JSON en un object C #.

L’object que je veux créer est MonthlyPerformance qui contient une liste de Type , qui contient une liste de Categories , qui à son tour contient une liste de Funds . Ils sont définis comme:

 public class MonthlyPerformance { public List Types { get; set; } } public class Type { public int Id { get; set; } public ssortingng CountryId { get; set; } public ssortingng Name { get; set; } public List Categories { get; set; } public Type() { } } public class Category { public int Id { get; set; } public ssortingng CountryId { get; set; } public ssortingng Name { get; set; } public List Funds { get; set; } public Category() { } } public class Fund { public int Id { get; set; } public ssortingng CountryId { get; set; } public ssortingng Name { get; set; } public Fund() { } } 

Je pensais que ce qui suit le ferait, mais ce n’est pas le cas. Il s’agit simplement de créer une instance de l’object Type avec tout null:

 var file = File.ReadAllText(filePath); var types = JsonConvert.DeserializeObject(file); 

C’est le JSON que j’utilise:

 { "MonthlyPerformance": { "Type": [ { "id": "65", "countryId": "IE", "name": "Irish Domestic Funds (Gross)", "Category": [ { "id": "25003334", "countryId": "IE", "name": "UK Equity", "ConfigurationFund": [ { "id": "25000301", "countryId": "IE", "name": "Aviva Irl UK Equity Fund" }, { "id": "25000349", "countryId": "IE", "name": "New Ireland UK Equity 9" } ] }, { "id": "25003339", "countryId": "IE", "name": "Irish Equity", "Fund": [ { "id": "25000279", "countryId": "IE", "name": "Friends First Irish Equity G" }, { "id": "25000305", "countryId": "IE", "name": "Irish Life Celticscope 2 G" } ] } ] }, { "id": "80", "countryId": "IE", "name": "Irish Individual Pensions", "Category": [ { "id": "25003347", "countryId": "IE", "name": "Asia Pacific Ex-Japan Equity", "Fund": [ { "id": "25001789", "countryId": "IE", "name": "Aviva Irl Pacific Basin Eq" }, { "id": "25002260", "countryId": "IE", "name": "Ir Life Pacific Eq Indexed P" } ] }, { "id": "25003365", "countryId": "IE", "name": "Flexible Equity", "Fund": [ { "id": "25003238", "countryId": "IE", "name": "Friends First Protected Equity Plus Fund S2" }, { "id": "25003267", "countryId": "IE", "name": "Friends First Protected Equity Plus Bond G" } ] } ] } ] } } 

Que dois-je faire pour que cela fonctionne?

édité pour inclure MonthlyPerformance

Je crois que le problème est dans votre chaîne Json.

 "Type": [ ... ] 

Devrait être

 "Types": [ ... ] 

Types est le nom de la propriété qui doit être désérialisée. Type plutôt le nom de la classe.

Il en va de même pour la propriété Categories de la classe Type .

De plus, j’ai simplement supprimé la racine "MonthlyPerformance" de la chaîne Json et cela a fonctionné à merveille. Avec Json.NET bien sûr.

Voici un extrait du code Json modifié avec les noms de propriété appropriés (notice, types, catégories, fonds et absence de la racine MonthlyPerformance).

 { "Types": [ { "id": "65", "countryId": "IE", "name": "Irish Domestic Funds (Gross)", "Categories": [ { "id": "25003334", "countryId": "IE", "name": "UK Equity", "Funds": [ { "id": "25000301", "countryId": "IE", "name": "Aviva Irl UK Equity Fund" }, { "id": "25000349", "countryId": "IE", "name": "New Ireland UK Equity 9" } ] } 

le code ci-dessus que vous avez pour vos classes semble correct à première vue.

J’ai réussi à désérialiser JSON avec la classe suivante (JavaScriptSerializer). utilisé comme suit

 using System.Web.Script.Serialization; JavaScriptSerializer js = new JavaScriptSerializer(); ssortingng file = File.ReadAllText(filePath); MonthyPerformance json = js.Deserialize(file); 

oh, et ajoutez [Serializable] à vos atsortingbuts de classe pour chaque classe

 [Serializable] class whatever{} 

Pensez-vous utiliser dynamic object dynamic au lieu d’une désérialisation en object? (sans déclarer le MonthlyPerformance , le Type , la Category , le Fund )

Facebook C # SDK obtenir langue / région de l’utilisateur

Géocodage Google Maps v3 côté serveur

Usage:

 dynamic jobj = JsonUtils.JsonObject.GetDynamicJsonObject(JsonSsortingng); foreach (var item in jobj.MonthlyPerformance.Type) { Console.WriteLine(item.name); foreach (var category in item.Category) { Console.WriteLine("\t" + category.name); if (category.ConfigurationFund != null) { foreach (var fund in category.ConfigurationFund) { Console.WriteLine("\t\t" + fund.name); } } } } 

La classe d’assistance nécessaire est ici

Les noms de vos propriétés ne correspondent pas à ceux de votre JSON. Je m’attendrais à ce que la sérialisation échoue.

Étant donné le JSON que vous avez posté, vos classes c # devraient ressembler à ceci. Je ne connais pas bien JSON.net, mais je suppose qu’ils ont un décorateur de propriété qui vous permettrait de spécifier le nom de la propriété JSON avec laquelle c # prop correspond.

 public class MonthlyPerformance { public List Type { get; set; } } public class Type { public int id { get; set; } public ssortingng countryId { get; set; } public ssortingng Name { get; set; } public List Category { get; set; } public Type() { } } public class Category { public int id { get; set; } public ssortingng countryId { get; set; } public ssortingng name { get; set; } public List ConfigurationFund{ get; set; } public Category() { } } public class Fund { public int id { get; set; } public ssortingng countryId { get; set; } public ssortingng name { get; set; } public Fund() { } } 

C’est ce que j’utilise pour la désérialisation JSON …

 using System.Web.Script.Serialization; namespace blahblah { public partial class AccessTierService : ServiceBase { public static T ia_deserialize_json(ssortingng json_ssortingng) { try { if ((Ssortingng.Compare(json_ssortingng, null) == 0) || (Ssortingng.Compare(json_ssortingng, "") == 0) || (Ssortingng.Compare(json_ssortingng, Ssortingng.Empty) == 0)) { return default(T); } JavaScriptSerializer serializer = new JavaScriptSerializer(); return (T)serializer.Deserialize(json_ssortingng); } catch (Exception) { return default(T); } } } } 

et l’appeler …

 login_request = ia_deserialize_json(body_ssortingng);