How to deserialize this JSON into an object?

I am trying to use JSON.Net to deserialize a JSON object into a C # object.

The object I want to create is MonthlyPerformance , which contains a Type list, which contains a Categories list, which in turn contains a Funds list. They are defined as:

 public class MonthlyPerformance { public List<Type> Types { get; set; } } public class Type { public int Id { get; set; } public string CountryId { get; set; } public string Name { get; set; } public List<Category> 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<ConfigurationFund> 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() { } } 

I thought the following would do it, but it is not. It simply creates an instance of the Type object with all null:

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

This is the JSON I am using:

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

What do I need to do to make this work?

edited to include MonthlyPerformance

+4
source share
5 answers

I believe the problem is in your Json line.

 "Type": [ ... ] 

Must be

 "Types": [ ... ] 

Types is the name of the property to be deserialized; you mistakenly put the Type class name.

The same applies to the Categories property in the Type class.

Also I just removed the "MonthlyPerformance" root from the Json line and worked like a charm. Of course with Json.NET.

Here are fragments of modified Json with the corresponding property names (notification, types, categories, funds and lack of MonthlyPerformance root)

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

Is it possible to use a dynamic object instead of deserializing an object? (without declaration MonthlyPerformance , Type , Category , Fund )

Facebook C # SDK get custom language / region

Google Maps v3 Geocoding Server

Using:

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

The required helper class is here

+2
source

the above code that you have for your classes looks correct at first glance.

I succeeded with JSON deserialization with the following class (JavaScriptSerializer). used as follows

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

oh and add [Serializable] to your class attributes for each class

 [Serializable] class whatever{} 
+2
source

Your property names do not match your JSON names. I expect serialization to fail.

Given the published JSON, I expect your C # classes to look like this. I am not familiar with JSON.net, but I would suggest that they have a property decorator that allows you to specify a JSON property name that matches C # prop.

 public class MonthlyPerformance { public List<Type> Type { get; set; } } public class Type { public int id { get; set; } public string countryId { get; set; } public string Name { get; set; } public List<Category> 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<Fund> 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() { } } 
0
source

This is what I use for JSON deserialization ...

 using System.Web.Script.Serialization; namespace blahblah { public partial class AccessTierService : ServiceBase { public static T ia_deserialize_json<T>(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<T>(json_string); } catch (Exception) { return default(T); } } } } 

and call him ...

 login_request = ia_deserialize_json<ol_login_request>(body_string); 
0
source

Source: https://habr.com/ru/post/1382778/


All Articles