2013-10-04 2 views
0

Я пытаюсь десериализации этот JSon файл:Deserialize JSON объект, который содержит другой объект

{ 
    "result": 
    { 
     "car1":{"lat":37.989728,"long":23.664633}, 
     "car2":{"lat":38.008027,"long":23.774068} 
    } 
} 

Я пробовал так:

public static void parseJson(string data) 
{ 
    Result all = JsonConvert.DeserializeObject<Result>(data); 
} 

public class Result 
{ 
    public Car Car { get; set; } 
} 

public class Car 
{ 
    public string lat { get; set; } 
    public string lon { get; set; } 
} 

Но объект all остается нулевым

ответ

2

Вы можете получить то, что вам нужно, если вы сделаете свои классы, как это:

class Result 
{ 
    [JsonProperty("result")] 
    public Dictionary<string, Car> Cars { get; set; } 
} 

class Car 
{ 
    public decimal Lat { get; set; } 
    public decimal Long { get; set; } 
} 

Вот пример программы, демонстрирующее:

class Program 
{ 
    static void Main(string[] args) 
    { 
     string json = @" 
     { 
      ""result"": 
      { 
       ""car1"":{""lat"":37.989728,""long"":23.664633}, 
       ""car2"":{""lat"":38.008027,""long"":23.774068} 
      } 
     }"; 

     Result result = JsonConvert.DeserializeObject<Result>(json); 

     foreach (KeyValuePair<string, Car> kvp in result.Cars) 
     { 
      Console.WriteLine(kvp.Key + ": lat=" + kvp.Value.Lat + 
             ", long=" + kvp.Value.Long); 
     } 
    } 
} 

Вот выход выше:

car1: lat=37.989728, long=23.664633 
car2: lat=38.008027, long=23.774068 
+0

Прекрасно работает! Thanx –

2

объект в вашем JSON имеет два свойства: car1 и car2, поэтому класс, на который вы его сопоставляете (Result), должен иметь t шланг два свойства:

public class Result 
{ 
    public Car car1 { get; set; } 
    public Car car2 { get; set; } 
} 

Re ваш комментарий ниже:

Хорошо, но эти две машины являются примером. На самом деле количество автомобилей будет меняться каждый раз, когда я Позовите JSON

В этом случае JSON должен измениться, чтобы использовать массив:

{ 
    "result": 
    { 
     cars: [ 
      {"lat":37.989728,"long":23.664633}, 
      {"lat":38.008027,"long":23.774068} 
     ] 
    } 
} 

И тогда я думаю, что Result класс должен быть :

public class Result 
{ 
    public List<Car> cars { get; set; } 
} 

или, возможно,

public class Result 
{ 
    public Car[] cars { get; set; } 
} 

(Возможно, вы сможете избавиться от промежуточного объекта, если у вас на нем ничего нет, кроме автомобилей.)

+0

Хорошо, но эти две машины являются бывшими обильна. В действительности количество автомобилей будет меняться каждый раз, когда я получаю json. Как я могу это сделать? –

+0

@ jayt.dev: В этом случае вам понадобится массив в JSON, а не дискретные свойства. Я обновил ответ. –

+0

Спасибо за ваш ответ. Но json - это ответ HTTP-запроса на API, поэтому я не могу его изменить. Я должен выяснить, как обрабатывать существующий формат. –

0

см. Ниже. Фрагмент кода Надеюсь, он может вам помочь !!!

class WeapsCollection 
{ 
    public Dictionary<string, WeaponDetails> Weapons { get; set; } 

} 

class WeaponList 
{ 
    public WeaponDetails AEK { get; set; } 
    public WeaponDetails XM8 { get; set; } 
} 

class WeaponDetails 
{ 
    public string Name { get; set; } 
    public int Kills { get; set; } 
    public int Shots_Fired { get; set; } 
    public int Shots_Hit { get; set; } 
} 

class Program 
{ 
    static void Main(string[] args) 
    { 
     string json = @" 
     { 
      'weapons': 

        { 
         'aek': 
          { 
           'name':'AEK-971 Vintovka', 
           'kills':47, 
           'shots_fired':5406, 
           'shots_hit':858 
          }, 
         'xm8': 
          { 
           'name':'XM8 Prototype', 
           'kills':133, 
           'shots_fired':10170, 
           'shots_hit':1790 
          }, 
        } 

     }"; 

     WeapsCollection weps = JsonConvert.DeserializeObject<WeapsCollection>(json); 
     Console.WriteLine(weps.Weapons.First().Value.Shots_Fired);    

     Console.ReadLine(); 

    } 
} 
+0

Не поможет. У вас есть 2 оружия, но, как я описал выше, число моих «оружия» варьируется. –

Смежные вопросы