
本文详解如何在 ASP.NET(.NET Framework 或 .NET Core/5+)中解析外部 API 返回的 JSON 数据,根据 success 状态和 ParentList 非空条件安全触发业务逻辑更新,并提供强类型建模、反序列化及健壮性处理的最佳实践。
本文详解如何在 asp.net(.net framework 或 .net core/5+)中解析外部 api 返回的 json 数据,根据 `success` 状态和 `parentlist` 非空条件安全触发业务逻辑更新,并提供强类型建模、反序列化及健壮性处理的最佳实践。
在实际 ASP.NET 项目中,常需调用第三方或内部 REST API 获取结构化数据,并依据响应结果执行后续操作(如数据库更新、缓存刷新或通知分发)。本教程以典型场景为例:仅当 JSON 响应中 "success": "true"(注意:此处为字符串而非布尔值)且 "ParentList" 数组非空时,才执行更新逻辑。
✅ 正确建模 JSON 结构
首先,定义与 JSON 严格匹配的 C# 类。注意原始 JSON 中 "success" 是字符串 "true"/"false",不能直接映射为 bool 类型,否则反序列化会失败或产生默认值(false),导致逻辑误判。应先映射为 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; }
}⚠️ 注意:SuccessStr 使用 string 类型接收原始值,避免因 JSON 字符串 "true" 无法直接转 bool 导致反序列化异常或静默失败。
✅ 安全解析与条件判断
在获取 JSON 响应后(如您代码中通过 WebClient.UploadString 调用 API),使用 System.Text.Json(推荐,性能好且内置 .NET Core 3.0+;若为 .NET Framework,请安装 System.Text.Json NuGet 包)进行反序列化,并执行核心条件校验:
try
{
// 示例:jsonData 即您通过 WebClient 获取的响应字符串
var response = JsonSerializer.Deserialize<ApiResponse>(jsonData);
// 关键判断:success 字符串为 "true"(忽略大小写)且 ParentList 存在且非空
bool shouldUpdate = !string.IsNullOrEmpty(response?.SuccessStr)
&& string.Equals(response.SuccessStr.Trim(), "true", StringComparison.OrdinalIgnoreCase)
&& response.ParentList?.Count > 0;
if (shouldUpdate)
{
// ✅ 执行您的业务更新逻辑,例如:
foreach (var site in response.ParentList)
{
// 更新数据库、调用仓储层、记录日志等
UpdateSiteInDatabase(site, response.BuildingRjId);
}
Log.Information("Successfully updated {Count} parent sites for building {RjId}",
response.ParentList.Count, response.BuildingRjId);
}
else
{
Log.Warning("Skip update: success='{Success}' or ParentList empty", response?.SuccessStr);
}
}
catch (JsonException ex)
{
Log.Error(ex, "Failed to deserialize JSON response");
throw; // 或按需处理异常(如返回错误状态)
}✅ 补充建议与注意事项
- 不要混用 JavaScriptSerializer 和 System.Text.Json:JavaScriptSerializer 已过时(.NET Framework 旧方案),且不支持现代特性(如 JsonPropertyName)。统一使用 System.Text.Json 或 Newtonsoft.Json(若需兼容旧项目)。
- 空值防护:始终对 response、response.ParentList 做 null 检查,避免 NullReferenceException。
-
坐标解析增强:Site_GeoCoordinates 为 "lat,lng" 格式字符串,如需数值计算,建议扩展 ParentSite 类添加解析属性:
public (double Latitude, double Longitude) GetCoordinates() { if (string.IsNullOrWhiteSpace(SiteGeoCoordinates)) return (0, 0); var parts = SiteGeoCoordinates.Split(','); return (double.TryParse(parts[0], out var lat) ? lat : 0, double.TryParse(parts[1], out var lng) ? lng : 0); } - 异步优先:生产环境请改用 HttpClient + await client.PostAsync(...) 替代阻塞式 WebClient,提升吞吐量与可伸缩性。
遵循以上结构化建模、严谨条件判断与防御性编程原则,即可在 ASP.NET 应用中稳健实现“按 JSON 状态触发更新”的核心业务流程。


















