2016-11-10 616 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}";