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

ASP.NET Core集成Firebase时返回嵌套子节点列表为空问题求解

问题原因&解决方案

导致该问题的错误有多处,逐一修正即可:

1. 实体类定义错误

  • 属性命名不匹配:Route类中定义的嵌套节点属性名为Stops,但Firebase中对应的节点名为Waypoints,同时你在查询返回的映射逻辑中错误使用了不存在的Waypoints属性赋值,导致序列化前后对应不上。
  • 字段未转为属性:Waypoints类中的Vias是公共字段,ASP.NET Core系统级的序列化/反序列化只会识别公共属性,不会处理字段。
  • JSON键大小写不匹配:Firebase中存储的字段名是小写开头/下划线格式(如coordonnees、seq_number),而C#类中是大写开头的帕斯卡命名,默认规则下无法映射。
  • Firebase集合类型不匹配:Firebase中的子集合是键值对对象格式,不是原生数组,不能直接反序列化为List<Via>,需要先转成字典再处理。

2. 查询逻辑冗余错误

你已经在首次拉取Routes时拿到了全量数据,无需再循环单独请求Waypoints子节点,额外增加请求开销,同时你在给route.Stops.Vias赋值时没有判断route.Stops是否为null,会偶发空引用异常。

修正后的代码

实体类修正:

// 若项目用Newtonsoft.Json作为序列化组件,把JsonPropertyName替换为JsonProperty即可
using System.Text.Json.Serialization;

public class Route
{
    public string Route_ID { get; set; }
    public string Destination { get; set; }
    public string Origin { get; set; }
    // 匹配Firebase节点名,也可以直接把属性名改成Waypoints
    [JsonPropertyName("Waypoints")] 
    public Waypoints Stops { get; set; }
}

public class Via
{
    public string Via_ID { get; set; }
    public string Route_ID { get; set; }
    [JsonPropertyName("seq_number")] // 匹配Firebase的下划线命名
    public int Seq_Number { get; set; }
    [JsonPropertyName("coordonnees")]
    public string Coordonnees { get; set; }
    [JsonPropertyName("description")]
    public string Description { get; set; }
}

public class Waypoints
{
    // 先接收Firebase的键值对格式,JsonIgnore设置为序列化返回时不输出字典
    [JsonIgnore] 
    public Dictionary<string, Via> ViaDict { get; set; } = new();
    // 对外只输出Vias数组
    public List<Via> Vias => ViaDict.Values.ToList();
}

接口逻辑修正:

[HttpGet]
public async Task<IEnumerable<Route>> Get()
{          
    var routes = (await firebaseClient
        .Child("routes")
        .OrderByKey()
        .OnceAsync<Route>())
        .Select(item =>
        {
            var route = item.Object;
            route.Route_ID = item.Key;
            // 给Via的ID属性赋值
            if (route.Stops?.ViaDict != null)
            {
                foreach (var (viaId, via) in route.Stops.ViaDict)
                {
                    via.Via_ID = viaId;
                }
            }
            return route;
        }).ToList();
    return routes;
}

如果想要保持原来的单独请求逻辑,也可以只修正实体类的属性问题,同时在给route.Stops.Vias赋值前先实例化route.Stops = new Waypoints();即可。

内容的提问来源于stack exchange,提问作者Brandon P.

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.07 16:45:04