2016-11-10 24 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\"}" 

如果我單獨解析對象,那麼它工作正常,但我似乎無法讓它工作只是解析條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 '並將其重新設置爲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的應該是喜歡你的爲例:

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