[英]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.