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.
相关产品推荐
相关产品推荐

