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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.25 18:33:35