JsonConvert.DeserializeObject反序列化卫星位置列表返回null的解决方法
问题:反序列化n2yo卫星数据时SatellitePositions列表始终返回null
使用SatelliteData data = JsonConvert.DeserializeObject<SatelliteData>(con);反序列化n2yo.com API返回的卫星数据时,Info部分能正常加载,但SatellitePositions列表始终为null。相关代码定义及API返回JSON如下:
C#代码定义
public record SatelliteData(Info Info, List<Position> SatellitePositions); public record Info( string Satname, decimal Satid, decimal Transactionscount ); public record Position( decimal Satlatitude, decimal Satlongitude, decimal Elevation, decimal Sataltitude, decimal Azimuth, decimal Ra, decimal Dec, int Timestamp, bool Eclipsed );
API返回的JSON示例
{ "info": { "satname": "SPACE STATION", "satid": 25544, "transactionscount": 9 }, "positions": [ { "satlatitude": -51.62581948, "satlongitude": 163.19492627, "sataltitude": 436.56, "azimuth": 235.45, "elevation": -69.02, "ra": 31.64722806, "dec": -50.69031245, "timestamp": 1658524709, "eclipsed": false } ] }
解决方案
问题核心是C#记录属性名与JSON键名不匹配:JSON中卫星位置列表的键是positions,但代码中对应的属性名为SatellitePositions,Newtonsoft.Json默认无法识别这种完全不同的名称映射,导致列表反序列化失败。
提供两种可行的解决方式:
方式1:使用JsonProperty特性显式指定映射关系
修改SatelliteData的定义,为SatellitePositions属性添加JsonProperty特性,指定其对应的JSON键为positions:
public record SatelliteData(Info Info, [JsonProperty("positions")] List<Position> SatellitePositions);
为了避免后续类似问题,建议给所有属性统一添加该特性,确保映射关系明确:
public record Info( [JsonProperty("satname")] string Satname, [JsonProperty("satid")] decimal Satid, [JsonProperty("transactionscount")] decimal Transactionscount ); public record Position( [JsonProperty("satlatitude")] decimal Satlatitude, [JsonProperty("satlongitude")] decimal Satlongitude, [JsonProperty("elevation")] decimal Elevation, [JsonProperty("sataltitude")] decimal Sataltitude, [JsonProperty("azimuth")] decimal Azimuth, [JsonProperty("ra")] decimal Ra, [JsonProperty("dec")] decimal Dec, [JsonProperty("timestamp")] int Timestamp, [JsonProperty("eclipsed")] bool Eclipsed );
方式2:修改C#属性名使其与JSON键名匹配
直接将SatelliteData中的SatellitePositions改为Positions,让属性名与JSON键名(忽略大小写)对应:
public record SatelliteData(Info Info, List<Position> Positions);
Newtonsoft.Json默认支持PascalCase(C#属性命名规范)与camelCase(JSON键命名规范)的自动映射,修改后即可正常完成反序列化。
内容的提问来源于stack exchange,提问作者funker
相关产品推荐
相关产品推荐

