ReadAsAsync 调用 WebAPI 不将 json 重构为 class

ReadAsAsync calling a WebAPI not reconstituting json to class

我正在通过 JSON 调用 WebAPI returns 来自数据库的一些内容。内容在 JSON 中可见(使用 Fiddler 查看)但是当我尝试将响应数据放回 class 时,所有值在 class 中都是空的。

这曾经有效,但现在失败了。我怀疑我可能没有正确使用 GetAsync 和 ReadAsAsync。

新笔记 这是一个示例,但还有其他几个类似的调用会导致相同的问题。

知道为什么它停止工作了吗?什么是正确的修复方法?

Class:

 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" 属性,但您的 class 没有。将这些作为属性添加到您的 class。 .NET 无法反序列化 class 中的 json,因为它不具有与 class 完全相同的属性。

 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; }
}

EDIT 解决此问题的解决方法是使用 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;
        }

使方法异步并像这样使用 await