簡體   English   中英

將JSON數組反序列化為ObservableCollection

[英]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的內部反序列化器。 有幾種方法可以做到這一點:

  1. 您可以調用Execute()而不是在RestClient上調用Execute<T>() Execute()返回一個IRestResponse ,它具有一個Content屬性,該屬性將包含從請求返回的原始JSON字符串。 您可以獲取此字符串並將其傳遞給Json.Net的JsonConvert.DeserializeObject<T>()方法。

  2. 創建一個實現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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM