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);