2016-11-10 2 views
0

У меня есть модель, которая содержит и массив другого типа объекта. Родительский объект десериализуется отлично, но вложенный массив постоянно терпит неудачу.JSONConvert DeserializeObject с вложенным массивом

Вот мои объекты:

public class VenueRoomViewModel 
{ 
    public string Name { get; set; } 
    public decimal HourCost { get; set; } 
    public decimal DayCost { get; set; } 
    public int MaxDelegate { get; set; } 
    public string SpecialNotes { get; set; } 
    public string Status { get; set; } 

    [JsonProperty("AssociatedFacilities")] 
    public List<FacilityViewModel> AssociatedFacilities { get; set; } 
} 

public class FacilityViewModel 
{ 
    public string FacilityName { get; set; } 
    public int FacilityNo { get; set; } 
    public string FacilityStatus { get; set; } 
} 

Я стараюсь разобрать JSON как это:

VenueRoomViewModel myVM = sonConvert.DeserializeObject<VenueRoomViewModel>(jsonModel); 

и вот копия JSON, что он пытается разобрать:

"{\"State\":1,\"No\":\"0\",\"Name\":\"test\",\"HourCost\":\"12\",\"DayCost\":\"12\",\"MaxDelegate\":\"12\",\"SpecialNotes\":\"blah blah blah\",\"Status\":\"A\",\"AssociatedFacilities\":\"[{\\\"FacilityStatus\\\":1,\\\"FacilityNo\\\":\\\"1\\\",\\\"FacilityName\\\":\\\"Overhead Projector\\\"},{\\\"FacilityStatus\\\":1,\\\"FacilityNo\\\":\\\"5\\\",\\\"FacilityName\\\":\\\"New Facility\\\"}]\",\"VenueNo\":\"2\"}" 

Если я разобрал объекты индивидуально, тогда он работает нормально, но я не могу заставить его работать, просто разбирая stri ng

var converter = new ExpandoObjectConverter(); 
dynamic obj = JsonConvert.DeserializeObject<ExpandoObject>(jsonModel, converter); 
List<FacilityViewModel> facilities = JsonConvert.DeserializeObject<List<FacilityViewModel>>(obj.AssociatedFacilities); 

это разбирает вложенные массивы, поэтому я думаю, что json в порядке.

Вот она работает https://dotnetfiddle.net/znMYDZ

+0

'FacilityStatus' является' int' в данных, но 'string' в модели? И 'FacilityNo' является обратным этим. Думайте, что эти типы нуждаются в замене. – Lloyd

ответ

0

Проблема заключается в том, что ваш JSON кодирует AssociatedFacilities в виде строки. Попробуйте:

var json = @"{ 
    ""State"": 1, 
    ""No"": ""0"", 
    ""Name"": ""test"", 
    ""HourCost"": ""12"", 
    ""DayCost"": ""12"", 
    ""MaxDelegate"": ""12"", 
    ""SpecialNotes"": ""blah blah blah"", 
    ""Status"": ""A"", 
    ""AssociatedFacilities"": [{""FacilityStatus"":1,""FacilityNo"":""1"",""FacilityName"":""Overhead Projector""},{""FacilityStatus"":1,""FacilityNo"":""5"",""FacilityName"":""New Facility""}], 
    ""VenueNo"": ""2"" 
}"; 

JsonConvert.DeserializeObject<VenueRoomViewModel>(json); 
+0

Я думаю, что ты прав. Мне нужно записать его в скрытое поле, которое сохраняется при сохранении родительского объекта. По какой-то причине мне нужно сделать это так. Как я могу обойти это? – GrahamJRoy

+0

@GrahamJRoy, возможно, вы можете десериализовать содержимое своего скрытого поля как «List » и resersialize для JSON. – Nico

0

Вы JSON отличается от одного из https://dotnetfiddle.net/znMYDZ модель от вашего Json должна быть:

public class RootObject 
{ 
    public int State { get; set; } 
    public string No { get; set; } 
    public string Name { get; set; } 
    public string HourCost { get; set; } 
    public string DayCost { get; set; } 
    public string MaxDelegate { get; set; } 
    public string SpecialNotes { get; set; } 
    public string Status { get; set; } 
    public string AssociatedFacilities { get; set; } 
    public string VenueNo { get; set; } 
} 

Или, если вы хотите использовать модель Json должна быть как ваш Exemple:

string json = @" 
     {""Name"":""Test Room"", 
      ""HourCost"":1.72, 
      ""DayCost"":12.55, 
      ""MaxDelegate"":10, 
      ""SpecialNotes"":""This room has been added in the unit tests"", 
      ""Status"":""A"", 
      ""AssociatedFacilities"":[{ 
       ""FacilityStatus"":1, 
       ""FacilityNo"":""4"", 
       ""FacilityName"":""Practical Area""}, 
       {""FacilityStatus"":1, 
       ""FacilityNo"":""1"", 
       ""FacilityName"":""Overhead Projector""}], 
      ""No"":2352, 
      ""EditCounter"":0, 
      ""VenueNo"":2, 
      ""State"":2}"; 

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

  • Нет связанных вопросов^_^