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

调用Azure Maps矩阵路由API如何根据状态码动态反序列化response字段

解决方案

针对这种同层级字段决定当前字段反序列化类型的场景,最简洁的实现方式是使用Newtonsoft.Json的自定义JsonConverter处理Matrix类的反序列化逻辑,具体步骤如下:


第一步:编写自定义反序列化转换器

转换器会先读取statusCode值,再根据状态码选择对应类型反序列化response字段:

using Newtonsoft.Json;
using Newtonsoft.Json.Linq;

public class MatrixConverter : JsonConverter<Matrix>
{
    public override Matrix ReadJson(JsonReader reader, Type objectType, Matrix existingValue, bool hasExistingValue, JsonSerializer serializer)
    {
        JObject jObject = JObject.Load(reader);
        var matrix = new Matrix();
        
        // 优先读取状态码
        matrix.statusCode = jObject["statusCode"].Value<int>();
        // 直接反序列化错误详情字段
        matrix.detailedError = jObject["detailedError"]?.ToObject<Detailederror>(serializer);

        // 根据状态码处理response字段
        if (matrix.statusCode == 200)
        {
            // 200响应的response下嵌套routeSummary节点
            var responseNode = jObject["response"];
            matrix.response = responseNode["routeSummary"].ToObject<Routesummary>(serializer);
        }
        else if (matrix.statusCode == 400)
        {
            // 400响应的response为字符串类型错误信息
            matrix.response = jObject["response"].Value<string>();
        }
        else
        {
            // 其他状态码可自行扩展处理逻辑,默认保留原始字符串
            matrix.response = jObject["response"]?.ToString();
        }

        return matrix;
    }

    // 若不需要将实体序列化回JSON,可直接保留下方实现;有序列化需求可自行补充逻辑
    public override void WriteJson(JsonWriter writer, Matrix value, JsonSerializer serializer)
    {
        throw new NotImplementedException();
    }
}

第二步:关联转换器到Matrix类(可选优化)

可以直接在Matrix类上标注转换器特性,同时添加辅助属性简化业务调用:

// 关联自定义转换器,后续反序列化无需额外配置
[JsonConverter(typeof(MatrixConverter))]
public class Matrix
{
    public int statusCode { get; set; }
    public object response { get; set; }
    public Detailederror detailedError { get; set; }

    // 无序列化的辅助属性,业务层无需判断类型即可直接取值
    [JsonIgnore]
    public Routesummary SuccessRouteSummary => response as Routesummary;
    [JsonIgnore]
    public string ErrorMessage => response as string;
}

第三步:直接反序列化使用

完成上述配置后,直接调用原有反序列化方法即可正常解析:

// 无需额外参数,直接反序列化
Rootobject result = JsonConvert.DeserializeObject<Rootobject>(你的接口返回JSON字符串);

// 业务调用示例
foreach(var matrixRow in result.matrix)
{
    foreach(var item in matrixRow)
    {
        if(item.statusCode == 200)
        {
            // 直接获取路径结果
            var length = item.SuccessRouteSummary.lengthInMeters;
            var time = item.SuccessRouteSummary.travelTimeInSeconds;
        }
        else
        {
            // 直接获取错误信息
            var errMsg = item.ErrorMessage;
            var errCode = item.detailedError.code;
        }
    }
}

内容的提问来源于stack exchange,提问作者Conor Drew

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.01 22:36:06