You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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;

问题原因

  1. 接口返回格式不匹配:RapidAPI的该接口返回的是JSON数组(包含多个假日对象),但当前代码尝试将其反序列化为单个RootObj实例,导致序列化失败,所有字段为空。
  2. 缺少类级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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.14 01:46:35