2016-11-10 20 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は問題ありません。

は、ここでは、問題があなたのJSON文字列としてごAssociatedFacilitiesをコードすること、であるhttps://dotnetfiddle.net/znMYDZ

+0

'FacilityStatus'はデータ内の' int'ですが、モデルの 'string'ですか?そして、「FacilityNo」はその逆です。これらのタイプを交換する必要があると考えてください。 – Lloyd

答えて

0

を働いています。試してみてください:あなたのJSONがhttps://dotnetfiddle.net/znMYDZ から1と異なる

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からのモデルは次のようになります。

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}"; 
関連する問題