2016-11-10 4 views
0

Ich habe ein Modell, das und Array eines anderen Objekttyps enthält. Das übergeordnete Objekt deserialisiert die Feineinstellung, aber das verschachtelte Array schlägt ständig fehl.JSONConvert DeserializeObject mit verschachtelten Array

Hier sind meine Objekte:

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

ich versuchen, die json wie folgt analysieren:

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

und hier ist eine Kopie des json, die es zu analysieren versucht:

"{\"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\"}" 

Wenn ich die Objekte analysieren einzeln dann funktioniert es gut, aber ich kann nicht scheinen, um es einfach zu arbeiten, um die stri Parsen ng

dies analysiert die geschachtelte Array in Ordnung, so denke ich, dass der Json ist in Ordnung.

Hier ist es https://dotnetfiddle.net/znMYDZ

+0

'FacilityStatus' ist ein' int' in den Daten aber eine 'string' im Modell? Und 'FacilityNo' ist das Gegenteil davon. Denke, dass diese Typen ausgetauscht werden müssen. – Lloyd

Antwort

0

Arbeits Das Problem ist, dass Ihre JSON Ihre AssociatedFacilities als ein String codiert. Versuchen:

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

Ich denke du hast Recht. Ich muss es in ein verstecktes Feld stopfen, das gespeichert wird, wenn die übergeordnete Entität gespeichert wird. Aus irgendeinem Grund muss ich es so machen. Wie kann ich das umgehen? – GrahamJRoy

+0

@GrahamJRoy vielleicht könnten Sie Ihren versteckten Feldinhalt als 'List ' deserialisieren und das JSON reserialisieren. – Nico

0

Sie json anders ist als die von https://dotnetfiddle.net/znMYDZ Das Modell von Ihrem Json sein sollte:

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

Oder wenn Sie Ihr Modell sein die Json sollte verwenden möchten wie Ihre 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}"; 
Verwandte Themen