簡體   English   中英

ReadAsAsync 調用 WebAPI 不會將 json 重構為類

[英]ReadAsAsync calling a WebAPI not reconstituting json to class

我正在調用一個 WebAPI,它通過 JSON 從數據庫返回一些內容。 內容在 JSON 中可見(使用 Fiddler 查看)但是當我嘗試將響應數據放回類中時,類中的所有值都為空。

這曾經有效,但現在失敗了。 我懷疑我可能沒有正確使用 GetAsync 和 ReadAsAsync。

new note這是一個示例,但還有其他幾個類似的調用會導致相同的問題。

任何想法為什么這已經停止工作? 修復它的正確方法是什么?

班上:

 public class ContentElement : ICloneable
{
    public object Clone()
    {
        return this.MemberwiseClone();
    }
    public int PageId { get; set; }
    public string LanguageCode { get; set; }
    public int ContentId { get; set; }
    public string PageName { get; set; }
    public string Content { get; set; }
    public int? DisplayOrder { get; set; }
}

編碼:

 public static List<ContentElement> GetContent(int siteId)
    {
        var contentElements = new List<ContentElement>();
        using (HttpClient client = new HttpClient())
        {
            client.BaseAddress = new Uri(GlobalValues.APIUri);
            client.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json"));
            AddAuthenticationHeader(client);
            var result = client.GetAsync("api/Content/GetContent/" + (object)siteId).Result;
            if (result.IsSuccessStatusCode)
            {
                contentElements.AddRange((IEnumerable<ContentElement>)result.Content.ReadAsAsync<List<ContentElement>>().Result);
            }
        }
        return contentElements;
    }

JSON:

[{"PageId":1,"LanguageCode":"en","ContentId":5,"PageName":"Greeting",
"Content":"Content goes here","DisplayOrder":1,"Image":null,"ContentType":"Text"}]

您的 json 具有“Image”和“ContentType”屬性,但您的類沒有。 將這些作為屬性添加到您的類中。 .NET 無法反序列化您的類中的 json,因為它沒有與類完全相同的屬性。

 public class ContentElement : ICloneable
{
    public object Clone()
    {
        return this.MemberwiseClone();
    }
    public int PageId { get; set; }
    public string LanguageCode { get; set; }
    public int ContentId { get; set; }
    public string PageName { get; set; }
    public string Content { get; set; }
    public int? DisplayOrder { get; set; }
    public byte[] Image { get; set; } //not sure what type this should be
    public string ContentType { get; set; }
}

編輯對此的解決方法是使用 Newtonsoft.Json 反序列化 json 而不是使用 .NET 函數。

contentElements.AddRange((IEnumerable<ContentElement>)JsonConvert.Deserialize<IEnumerable<ContentElement>>(result.Content));
 public async static Task<List<ContentElement>> GetContent(int siteId)
        {
            var contentElements = new List<ContentElement>();
            using (HttpClient client = new HttpClient())
            {
                client.BaseAddress = new Uri(GlobalValues.APIUri);
                client.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json"));
                AddAuthenticationHeader(client);
                var result =await client.GetAsync("api/Content/GetContent/" + (object)siteId);
                if (result.IsSuccessStatusCode)
                {
                    contentElements.AddRange((IEnumerable<ContentElement>)result.Content.ReadAsStringAsync<List<ContentElement>>());
                }
            }
            return contentElements;
        }

使方法異步並像這樣使用等待

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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