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
我正在通过 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