
本文详解如何在 ASP.NET 应用中解析外部 API 返回的 JSON 数据,依据 success 字段和 ParentList 长度进行安全校验,并在满足条件时执行业务更新逻辑。涵盖模型定义、反序列化、空值防护及典型更新场景。
本文详解如何在 asp.net 应用中解析外部 api 返回的 json 数据,依据 `success` 字段和 `parentlist` 长度进行安全校验,并在满足条件时执行业务更新逻辑。涵盖模型定义、反序列化、空值防护及典型更新场景。
在 ASP.NET(.NET Framework 或 .NET Core/5+)中处理第三方 API 的 JSON 响应时,需兼顾健壮性与可维护性。针对您提供的 JSON 结构,核心逻辑是:仅当 "success": "true"(注意:此处为字符串而非布尔值)且 ParentList 数组非空时,才触发后续数据库或业务层的更新操作。以下为完整、生产就绪的实现方案。
✅ 正确建模与反序列化
首先,定义强类型模型。注意原始 JSON 中 "success" 是字符串 "true"/"false",而非 JSON 布尔值,因此不能直接映射为 bool,否则会反序列化失败。应使用 string 类型并手动转换:
using System.Text.Json;
using System.Text.Json.Serialization;
public class ApiResponse
{
[JsonPropertyName("success")]
public string SuccessStr { get; set; }
[JsonPropertyName("Building_rjid")]
public string BuildingRjId { get; set; }
[JsonPropertyName("ParentList")]
public List<parentsite> ParentList { get; set; } = new();
}
public class ParentSite
{
[JsonPropertyName("Site_sap_id")]
public string SiteSapId { get; set; }
[JsonPropertyName("Site_GeoCoordinates")]
public string SiteGeoCoordinates { get; set; }
[JsonPropertyName("Site_priority")]
public string SitePriority { get; set; }
[JsonPropertyName("BearingAngleFromBuilding")]
public int BearingAngleFromBuilding { get; set; }
}</parentsite>
✅ 安全解析与条件判断
使用 System.Text.Json(推荐,性能优于 JavaScriptSerializer)解析响应,并严格校验:
try
{
// 获取 JSON 响应(替换为您实际的 WebClient 调用)
string jsonData = client.UploadString(apiUrl_CheckBldg, strInputJSON_BldgRJID);
var response = JsonSerializer.Deserialize<apiresponse>(jsonData);
// 关键校验:success 为 "true" 字符串 && ParentList 不为空
if (response?.SuccessStr?.Equals("true", StringComparison.OrdinalIgnoreCase) == true
&& response.ParentList?.Count > 0)
{
// ✅ 满足条件:执行更新逻辑
foreach (var site in response.ParentList)
{
// 示例:更新数据库中的站点关联记录
UpdateSiteAssociation(
buildingRjId: response.BuildingRjId,
siteSapId: site.SiteSapId,
geoCoords: site.SiteGeoCoordinates,
priority: site.SitePriority,
bearing: site.BearingAngleFromBuilding
);
}
Console.WriteLine($"成功更新 {response.ParentList.Count} 条关联记录。");
}
else
{
// ⚠️ 不满足条件:记录日志,不执行更新
Log.Warning($"API 响应未通过校验:Success='{response?.SuccessStr}', ParentList.Count={response?.ParentList?.Count}");
}
}
catch (JsonException ex)
{
Log.Error(ex, "JSON 反序列化失败");
}
catch (Exception ex)
{
Log.Error(ex, "API 调用或更新过程异常");
}</apiresponse>
⚠️ 注意事项与最佳实践
- 避免 JavaScriptSerializer:该类已过时(.NET Framework 3.5+),且不支持现代 JSON 特性;统一改用 System.Text.Json(.NET Core 3.0+)或 Newtonsoft.Json(兼容旧版)。
- 字符串 vs 布尔字段:务必确认 API 实际返回的 success 是字符串(如 "true")还是布尔(true)。若为布尔,模型中应定义为 public bool Success { get; set; }。
- 空值防护:始终对 response、response.ParentList 进行 null 检查,防止 NullReferenceException。
-
坐标解析建议:Site_GeoCoordinates 字段为 "lat,lng" 格式字符串,如需存入数据库地理类型(如 SQL Server 的 geography),应拆分为 double 并验证格式:
if (!string.IsNullOrWhiteSpace(site.SiteGeoCoordinates) && site.SiteGeoCoordinates.Split(',').Length == 2 && double.TryParse(site.SiteGeoCoordinates.Split(',')[0], out double lat) && double.TryParse(site.SiteGeoCoordinates.Split(',')[1], out double lng)) { // 使用 lat/lng 构造地理点 } - 事务与幂等性:更新操作建议包裹在数据库事务中,并考虑添加唯一约束或 UPSERT 逻辑,避免重复提交导致数据异常。
通过以上结构化实现,您可安全、高效地将外部 JSON 响应转化为可控的业务更新流程,同时具备良好的可读性与可维护性。











