2011-11-23 1 views
4

Я пытаюсь использовать JSON.Net для десериализации объекта JSON в объект C#.Как десериализовать этот JSON в объект?

Объект Я хочу создать это MonthlyPerformance, который содержит список Type, который содержит список Categories, который, в свою очередь, содержит список Funds. Они определены как:

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() 
    { 

    } 
} 

Я думал, что следующее будет сделано, но это не так. Это просто создает экземпляр объекта Type со всем нулем:

var file = File.ReadAllText(filePath); 

var types = JsonConvert.DeserializeObject<Type>(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

+0

вы думаете, что ваш код имеет в виду тип вы определили или предопределенный 'Type' в .net. также посмотрите на http://james.newtonking.com/projects/json-net.aspx – DarthVader

+0

Привет @DarthVader, я вижу, что тип 'Type' находится в моем собственном пространстве имен. Даже когда я изменил его, чтобы попытаться создать экземпляр «MonthlyPerformance» (я обновил вопрос с этим), он по-прежнему ведет себя одинаково. – DaveDev

ответ

2

Я считаю, что проблема в вашей строке Json.

"Type": [ ... ] 

Должно быть

"Types": [ ... ] 

Types это имя свойства, которое должно быть десериализации, вы ошибочно поместить Type имя класса вместо.

То же самое касается Categories недвижимости в категории Type.

Также Я просто удалил "MonthlyPerformance" корень из строки Json и работал как шарм. Конечно, с 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" 
     } 
    ] 
} 
2

ли вы думаете использовать dynamic объект вместо десериализации на объект? (Без объявления MonthlyPerformance, Type, Category, Fund)

Facebook C# SDK get user language/region

Google Maps v3 geocoding server-side

Использование:

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

Вспомогательный класс Необходим here

2

выше код, который у вас есть для ваши классы выглядят с первого взгляда.

Мне удалось десериализовать JSON со следующим классом (JavaScriptSerializer). используется следующим образом

using System.Web.Script.Serialization; 

JavaScriptSerializer js = new JavaScriptSerializer(); 
string file = File.ReadAllText(filePath); 
MonthyPerformance json = js.Deserialize<MonthlyPerformance>(file); 

о, и добавить [Serializable], чтобы ваш класс атрибутов для каждого класса

[Serializable] 
class whatever{} 
0

Ваши имена свойств не соответствуют, что вашего JSON. Я ожидаю, что сериализация завершится неудачей.

Учитывая, что вы отправили JSON, я ожидал, что ваши классы C# будут выглядеть так. Я не знаком с JSON.net, но я бы предположил, что у них есть декоратор свойств, который позволит вам указать имя свойства JSON, также совпадающее с 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

Это то, что я использую для JSON десериализации ...

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

и назвать его ...

login_request = ia_deserialize_json<ol_login_request>(body_string);