2015-11-30 5 views
2

У меня есть JSon сообщениеNull встречается при десериализации JSON

{"code":200, 
"description":{ 
"15":{"id":"15","name":"US"}, 
"25":{"id":"25","name":"Canada"}, 
"msg":"Ok"}} 

Я пытаюсь десериализации его с такими классами

public class NewCountry 
{ 
    public string id { get; set; } 
    public string name { get; set; } 
} 

public class NewCountryDescription 
{ 
    public List<NewCountry> Countries{ get; set; } 
    public string msg { get; set; } 
} 

public class RootObject 
{ 
    public int code { get; set; } 
    public NewCountryDescription description { get; set; } 
} 

var ListOfCountries = Newtonsoft.Json.JsonConvert.DeserializeObject<RootObject>(res); 

Но я всегда получаю нуль в NewCountry, что я делаю неправильно?

+0

У вашего JSON есть недопустимые имена классов C#. Возможно, вы захотите использовать действующие, чтобы вы могли более легко десериализовать. –

+0

В дополнение к тому, что говорит Юваль, вы используете список (сбор) стран, но JSON явно возвращает 2, а не коллекцию, поэтому определение вашего класса не соответствует JSON. –

+0

У вас должен быть msg в описании? – Icet

ответ

2

Если вы удалите сбщи из вашего JSON или переместить его в другом месте (не в Descrition), он будет работать:

{"code":200, 
"description":{ 
"15":{"id":"15","name":"US"}, 
"25":{"id":"25","name":"Canada"} 
}} 


    public class RootObject 
    { 
     public int code { get; set; } 
     public Dictionary<string, NewCountry> description { get; set; } 
    } 

    public class NewCountry 
    { 
     public string id { get; set; } 
     public string name { get; set; } 
    } 
2

Вы не оформленная коллекции, так что вы можете использовать JObject и динамический или ключ/ценность доступа.

 var result = JObject.Parse(res); 
     var description = (result["description"] as JObject); 

     if (description != null) 
     { 
      var root = new RootObject 
      { 
       code = (int)result["code"], 
       description = new NewCountryDescription 
       { 
        msg = description["msg"].ToString(), 
        Countries = (from prop in description.Properties() 
           where prop.Name != "msg" 
           select new NewCountry 
           { 
            id = prop.Value["id"].ToString(), 
            name = prop.Value["name"].ToString() 
           }).ToList() 
       } 
      }; 

      Console.Write(root); 
     }