调用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
相关产品推荐
相关产品推荐

