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

.NET MAUI调用Unsplash API遇返回Null及CS1579错误,ListView无显示

问题解决:Unsplash API调用的两个关键问题修复

问题1:CS1579错误(foreach无法遍历Root类型)

Unsplash搜索照片API的响应结构中,照片集合嵌套在results字段里,你直接遍历apiResponse(Root类型对象)属于逻辑错误——Root类本身没有实现枚举器,因此会触发该编译错误。正确做法是遍历apiResponse.Results属性。

问题2:API Response返回null

这是因为你未定义与Unsplash API响应匹配的实体类结构,导致Newtonsoft.Json无法完成正确的反序列化,最终得到null结果。需要严格按照API返回的JSON格式定义对应类。

完整修复代码

第一步:添加匹配API响应的实体类

public class Root
{
    [JsonProperty("results")]
    public List<Photo> Results { get; set; }
}

public class Photo
{
    [JsonProperty("user")]
    public User User { get; set; }
    // 可按需添加其他字段,如照片链接、ID等
}

public class User
{
    [JsonProperty("username")]
    public string Username { get; set; }
}

第二步:修改MainPage中的请求处理逻辑

private async void OnCounterClicked(object sender, EventArgs e)
{
    // 复用HttpClient,避免重复创建导致资源浪费
    using var client = new HttpClient();
    var url = "https://api.unsplash.com/search/photos/?page=1&query=office&client_id=R62b2dZL9UoHcYhxook8WAkwklTUcBHqhJEmxe5AEqY";
    try
    {
        HttpResponseMessage response = await client.GetAsync(url);
        // 提前校验响应状态,失败直接抛出异常
        response.EnsureSuccessStatusCode();
        
        var content = await response.Content.ReadAsStringAsync();
        var apiResponse = JsonConvert.DeserializeObject<Root>(content);

        if (apiResponse?.Results != null && apiResponse.Results.Any())
        {
            // 清空列表避免重复添加数据
            lst.Clear();
            foreach (var photo in apiResponse.Results)
            {
                if (!string.IsNullOrEmpty(photo.User?.Username))
                {
                    lst.Add(photo.User.Username);
                }
            }
            // 重置数据源触发ListView更新
            imageListView.ItemsSource = null;
            imageListView.ItemsSource = lst;
        }
        else
        {
            await DisplayAlert("提示", "未获取到有效照片数据", "确定");
        }
    }
    catch (HttpRequestException ex)
    {
        await DisplayAlert("请求错误", $"HTTP请求失败:{ex.Message}", "确定");
    }
    catch (JsonException ex)
    {
        await DisplayAlert("序列化错误", $"JSON解析失败:{ex.Message}", "确定");
    }
    catch (Exception ex)
    {
        await DisplayAlert("未知错误", ex.Message, "确定");
    }
}

额外优化建议

  • 用ObservableCollection<string>替代List<string>作为lst的类型,集合内容变化时ListView会自动更新,无需手动重置ItemsSource。
  • 不要在客户端硬编码Unsplash Client ID,建议通过后端代理转发API请求,避免密钥泄露。
  • 类级别复用HttpClient实例,而非每次请求都创建新对象,防止Socket资源耗尽。

内容的提问来源于stack exchange,提问作者Shubhankar Pande

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.26 16:57:45