UWP应用调用RapidAPI获取公共假日后反序列化字段为空求助
UWP调用RapidAPI公共假日接口反序列化后字段为空问题
问题场景
开发UWP应用的公共假日功能,调用RapidAPI的Public Holidays接口时,调试输出能看到完整的JSON响应内容,但将响应反序列化为RootObj类实例后,访问name、date、type等字段均返回空值。
相关代码
API调用代码
var client = new HttpClient(); var request = new HttpRequestMessage { Method = HttpMethod.Get, RequestUri = new Uri("https://public-holiday.p.rapidapi.com/2023/SG"), Headers = { { "X-RapidAPI-Key", "API-Key" }, { "X-RapidAPI-Host", "public-holiday.p.rapidapi.com" }, }, }; using (var response = await client.SendAsync(request)) { response.EnsureSuccessStatusCode(); var body = await response.Content.ReadAsStringAsync(); var serializer = new DataContractJsonSerializer(typeof(RootObj)); Debug.WriteLine(body); var ms = new MemoryStream(Encoding.UTF8.GetBytes(body)); var data = (RootObj)serializer.ReadObject(ms); return data; }
RootObj类定义
public class RootObj { [DataMember] public string date { get; set; } [DataMember] public string localName { get; set; } [DataMember] public string name { get; set; } [DataMember] public string countryCode { get; set; } [DataMember] public bool @fixed { get; set; } [DataMember] public bool global { get; set; } [DataMember] public object counties { get; set; } [DataMember] public object launchYear { get; set; } [DataMember] public string type { get; set; } }
MainPage调用代码
RootObj myHolidays = await GetHolidays(); holidayTextBlock.Text = myHolidays.name + " - " + myHolidays.date + " - " + myHolidays.type;
问题原因
- 接口返回格式不匹配:RapidAPI的该接口返回的是JSON数组(包含多个假日对象),但当前代码尝试将其反序列化为单个
RootObj实例,导致序列化失败,所有字段为空。 - 缺少类级DataContract特性:
RootObj类仅标记了[DataMember]成员特性,但未添加类级别的[DataContract]特性,DataContractJsonSerializer无法识别类的序列化规则,导致成员无法被正确赋值。
解决方案
1. 修正RootObj类,添加DataContract特性
[DataContract] // 必须添加类级别的DataContract特性 public class RootObj { [DataMember] public string date { get; set; } [DataMember] public string localName { get; set; } [DataMember] public string name { get; set; } [DataMember] public string countryCode { get; set; } [DataMember] public bool @fixed { get; set; } [DataMember] public bool global { get; set; } [DataMember] public object counties { get; set; } [DataMember] public object launchYear { get; set; } [DataMember] public string type { get; set; } }
2. 修改API调用方法,反序列化为数组类型
调整GetHolidays方法的返回类型为Task<RootObj[]>,并将序列化目标改为数组:
public async Task<RootObj[]> GetHolidays() { var client = new HttpClient(); var request = new HttpRequestMessage { Method = HttpMethod.Get, RequestUri = new Uri("https://public-holiday.p.rapidapi.com/2023/SG"), Headers = { { "X-RapidAPI-Key", "API-Key" }, { "X-RapidAPI-Host", "public-holiday.p.rapidapi.com" }, }, }; using (var response = await client.SendAsync(request)) { response.EnsureSuccessStatusCode(); var body = await response.Content.ReadAsStringAsync(); Debug.WriteLine(body); // 反序列化为RootObj数组 var serializer = new DataContractJsonSerializer(typeof(RootObj[])); var ms = new MemoryStream(Encoding.UTF8.GetBytes(body)); var data = (RootObj[])serializer.ReadObject(ms); return data; } }
3. 调整MainPage中的调用逻辑
现在返回的是数组,需遍历或取指定元素来显示:
RootObj[] myHolidays = await GetHolidays(); // 示例:取第一个假日数据显示 if (myHolidays.Length > 0) { var firstHoliday = myHolidays[0]; holidayTextBlock.Text = $"{firstHoliday.name} - {firstHoliday.date} - {firstHoliday.type}"; }
内容的提问来源于stack exchange,提问作者Kim
相关产品推荐
相关产品推荐

