.NET8 API请求参数为空排查:GeoPoint反序列化异常?
问题分析与解决方法
你的接口参数jpr始终为null,核心问题出在GeoPoint类的反序列化支持上,具体问题和修复方案如下:
1. 缺少无参数公共构造函数
.NET默认的JSON反序列化器(System.Text.Json)需要目标类具备无参数公共构造函数才能创建实例。你的GeoPoint类仅提供了带参数的构造函数和私有构造函数,反序列化器无法实例化该类,导致整个JourneyPlannerRequest_v2对象反序列化失败,最终返回null。
2. lat/lng的setter为空实现
当前lat和lng的setter都是空逻辑(set { }),即便反序列化器能创建GeoPoint实例,也无法将JSON中的经纬度值写入对象,后续依赖geoObj的逻辑会完全失效。
3. 未暴露SRID的公共属性
请求JSON中包含srid字段,但GeoPoint类没有对应的公共属性,导致该字段无法被反序列化。虽然这不是参数为null的直接原因,但会导致SRID值丢失,影响业务逻辑。
修复后的代码示例
修改GeoPoint类
public class GeoPoint : iSpatialPoint { // 添加无参数公共构造函数,供反序列化器使用 public GeoPoint() { geoObj = new Point(0, 0); geoObj.SRID = 4326; // 设置默认SRID } public GeoPoint(double lat, double lng, int srid = 4326) { geoObj = new Point(lng, lat); geoObj.SRID = srid; } // 保留私有构造(如果业务需要) private GeoPoint(Point obj) : base(obj) { } private Point geoObj { get; set; } public double lat { get => geoObj.Coordinate.Y; set => geoObj.Coordinate = new Coordinate(geoObj.Coordinate.X, value); } public double lng { get => geoObj.Coordinate.X; set => geoObj.Coordinate = new Coordinate(value, geoObj.Coordinate.Y); } // 添加SRID的公共属性,映射JSON中的srid字段 public int srid { get => geoObj.SRID; set => geoObj.SRID = value; } }
额外验证项
确保请求的Content-Type请求头设置为application/json,这是ASP.NET Core识别[FromBody]参数并执行JSON反序列化的必要前提。
内容的提问来源于stack exchange,提问作者B_Cbk
相关产品推荐
相关产品推荐

