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

.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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.03 21:46:05