如何将此JSON反序列化为对象?

我正在尝试使用JSON.Net将JSON对象反序列化为C#对象。

我想要创建的对象是MonthlyPerformance ,它包含Type列表,其中包含Categories列表,而MonthlyPerformance列表又包含一个Funds列表。 它们被定义为:

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

我认为以下会这样做,但事实并非如此。 它只是创建一个Type对象的实例,其中包含所有null:

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

这是我正在使用的JSON:

 { "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" } ] } ] } ] } } 

我需要做些什么才能让它发挥作用?

编辑以包含MonthlyPerformance

我相信问题出在你的Json字符串中。

 "Type": [ ... ] 

应该

 "Types": [ ... ] 

Types是应该反序列化的属性的名称,你错误地输入Type类名。

Type类中的Categories属性也是如此。

此外,我只是从Json字符串中删除了"MonthlyPerformance"根,它就像一个魅力。 当然还有Json.NET。

以下是修改后的Json的片段,其中包含适当的属性名称(通知,类型,类别,基金和缺少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" } ] } 

您对类的上述代码乍一看看起来是正确的。

我已成功使用以下类(JavaScriptSerializer)反序列化JSON。 用法如下

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

哦,并为每个类的类属性添加[Serializable]

 [Serializable] class whatever{} 

您是否会考虑使用dynamic对象而不是反序列化到对象? (未声明MonthlyPerformanceTypeCategoryFund

Facebook C#SDK获取用户语言/区域

Google Maps v3地理编码服务器端

用法:

 dynamic jobj = JsonUtils.JsonObject.GetDynamicJsonObject(JsonString); 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); } } } } 

所需的助手类就在这里

您的属性名称与JSON的属性名称不匹配。 我希望序列化失败。

鉴于您发布的JSON,我希望您的c#类看起来像这样。 我不熟悉JSON.net,但我认为他们有一个属性装饰器,允许你指定c#prop匹配的JSON属性的名称。

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

这就是我用于JSON反序列化的内容……

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

并称之为……

 login_request = ia_deserialize_json(body_string);