2016-10-02 97 views
5

我有困難寫入適當的註解以表示這是從一個JSON返回Get請求返回像這樣的數據的數據:反序列化未命名的陣列

[{"ProductCode":"0129923083091","Description":"DIESEL ","SalesLitres":6058.7347,"SalesValue":6416.2000},{"ProductCode":"0134039344902","Description":"UNLEADED ","SalesLitres":3489.8111,"SalesValue":3695.7100}, 
... 
] 

(省略號以上只是表明我可以具有可變的數這些物品返回)

在我的模型類(我使用的MVVM的做法了Xamarin的項目,但這裏並沒有結束有關),我使用的註解來表示模型屬性

namespace App8.Models 
    { 

     public class ReportRow 
     { 
      [JsonProperty("ProductCode")] 
      public string ProductCode { get; set; } = string.Empty; 

      [JsonProperty("Description")] 
      public string Description { get; set; } = string.Empty; 

      [JsonProperty("SalesLitres")] 
      public double SalesLitres { get; set; } = 0.0; 

      [JsonProperty("SalesValue")] 
      public double SalesValue { get; set; } = 0.0;  
     } 
    } 

我想註釋另一個顯示容器/包含關係的類。但是,由於在註釋中沒有提供用於表示返回集合的「根」的JSON屬性,所以我將會解決這個問題。

我沒有問題將JSON映射到任何在返回的JSON中命名的JSON數組的對象模型。在這種情況下,我可以使用包含C#List的名爲JSON屬性創建另一個類,但我試圖爲JSON提供適當的模型映射,該映射返回未命名數組內的項目列表。

任何想法,我可以如何處理這個?

+1

祝賀你制定了第一個問題! – Kroltan

回答

4

反序列化JSON,使用:

JsonConvert.DeserializeObject<List<ReportRow>>(json) 

(或任何變異,你願意的話,這裏的關鍵是要求反序列化的ReportRow一個ICollection這可能是你自己的類實現ICollection,或任何的。 builtins)

同樣的想法跟在JsonTextReader或任何其他反序列化JSON.NET提供的手段。只需使用ICollection<YourType>作爲目標類型。

+0

謝謝Kroltan。看起來我正確地做到了這一點,所以我正在做反序列化。我的問題是進一步堆棧,所以在Xamarin形式內,以及如何綁定到視圖模型內的列表等。這至少有助於我驗證我正在使用正確的方法來反序列化JSON。 – retail3r

+0

@ user6911358是的,這通常是對根數組進行反序列化的正確方法。如果你確實需要自己的類型(例如實現一個自定義接口),那麼你可以繼承這個'List '類型或其他集合。即使實施你自己的,如果真的有必要但它不應該,很可能。在你的Xamarin懷疑中發佈另一個問題,並將其鏈接到此處。 – Kroltan