[英]Deserializing a JSON array to a ObservableCollection
我正在使用RestSharp與遠程服務器通信。 我收到一個JSON序列化字符串,我可以反序列化為ac#對象。 我也能夠將json數組反序列化為List。 但是,我希望這些對象在WPF綁定中使用,所以我需要將它們放在ObservableCollection中以方便使用。 但是,如果我嘗試將屬性從List更改為ObservableCollection(或IList,或ICollection或Collection),則會在反序列化時出現異常。
Unable to cast object of type 'RestSharp.JsonArray' to type 'System.Collections.Generic.IDictionary`2[System.String,System.Object]
底層代碼真的不是特別的,但無論如何它在這里:
private ObservableCollection<StationDto> stations;
[JsonProperty(PropertyName = "stations")]
public ObservableCollection<StationDto> Stations
{
get { return this.stations; }
set
{
this.stations = value;
RaisePropertyChanged(() => Stations);
}
}
我知道接口不起作用,因為Json.net需要一個具體的類來序列化。
我已經做了相當多的谷歌搜索,但我還沒有看到解決方案。 是否有一種常用於json / rest服務的手工代理的模式?
查看RestSharp的源代碼 ,看起來它使用自己的內部JSON反序列化器(稱為SimpleJson),而不是使用Json.Net。 反序列化的RestSharp文檔確認反序列化器僅支持List<T>
和Dictionary<T1,T2>
集合類型。 另一方面, Json.Net更強大,可以處理反序列化為ObservableCollections。 我在這篇文章的最后用代碼嘗試了它並沒有看到任何問題。 考慮到這一點,我建議將Json.Net添加到您的解決方案中,並使用它來反序列化REST API調用的結果,而不是依賴於RestSharp的內部反序列化器。 有幾種方法可以做到這一點:
您可以調用Execute()
而不是在RestClient
上調用Execute<T>()
。 Execute()
返回一個IRestResponse
,它具有一個Content
屬性,該屬性將包含從請求返回的原始JSON字符串。 您可以獲取此字符串並將其傳遞給Json.Net的JsonConvert.DeserializeObject<T>()
方法。
創建一個實現RestSharp的IDeserializer
接口的類。 讓這個類簡單地交給Json.Net來完成反序列化JSON的實際工作。 然后,您可以通過在RestClient
類上調用AddHandler()
來告訴RestSharp使用此自定義反序列化器而不是它自己的。 根據文檔,您以這種方式添加的處理程序將替換相同內容類型的現有處理程序。 然后,您可以繼續以與RestClient
相同的方式使用RestClient
,但它現在應該與ObservableCollections
。
這是我用來測試Json.Net將反序列化為ObservableCollection
:
class Program
{
static void Main(string[] args)
{
string json = @"{""stations"":[{""Name"":""WXRT""},{""Name"":""WGN""}]}";
Foo foo = JsonConvert.DeserializeObject<Foo>(json);
foreach (StationDto dto in foo.Stations)
{
Console.WriteLine(dto.Name);
}
}
}
class StationDto
{
public string Name { get; set; }
}
class Foo
{
private ObservableCollection<StationDto> stations;
[JsonProperty(PropertyName = "stations")]
public ObservableCollection<StationDto> Stations
{
get { return this.stations; }
set
{
this.stations = value;
RaisePropertyChanged(() => Stations);
}
}
private void RaisePropertyChanged(Func<ObservableCollection<StationDto>> coll)
{
}
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.