如何反序列化Azure Consumption API返回的JSON对象?需对应什么类?
解决Azure Consumption API数据反序列化问题
一、定义匹配API返回结构的实体类
Azure Consumption API返回的usageDetails是嵌套结构,你需要定义以下几个C#类来对应JSON格式:
// 根响应对象 public class UsageDetailsResponse { public string Id { get; set; } public string Name { get; set; } public string Type { get; set; } public string NextLink { get; set; } // 分页用,非空说明还有更多数据 public List<UsageDetail> Value { get; set; } // 核心使用数据列表 } // 单条使用记录 public class UsageDetail { public string Id { get; set; } public string Name { get; set; } public string Type { get; set; } public UsageDetailProperties Properties { get; set; } // 记录的详细属性 } // 使用记录的核心属性(可根据实际返回字段扩展) public class UsageDetailProperties { public string SubscriptionId { get; set; } public string SubscriptionName { get; set; } public DateTime UsageStart { get; set; } public DateTime UsageEnd { get; set; } public string MeterName { get; set; } // 计量项名称 public decimal Quantity { get; set; } // 使用量 public decimal Cost { get; set; } // 费用 public string Currency { get; set; } public string ResourceGroup { get; set; } // 资源组名称(按需添加) }
二、反序列化并处理数据
可以用两种常用的序列化库来实现,选一种你项目里在用的就行:
方式1:用Newtonsoft.Json(需先安装NuGet包)
using Newtonsoft.Json; // 把JSON字符串反序列化为对象 var usageData = JsonConvert.DeserializeObject<UsageDetailsResponse>(data); // 遍历数据并计算示例 if (usageData?.Value != null) { // 计算总费用 decimal totalCost = usageData.Value.Sum(item => item.Properties.Cost); // 统计特定计量项的总使用量 var storageUsage = usageData.Value .Where(item => item.Properties.MeterName.Contains("Storage")) .Sum(item => item.Properties.Quantity); Console.WriteLine($"周期总费用:{totalCost:C}"); Console.WriteLine($"存储类资源总使用量:{storageUsage}"); }
方式2:用System.Text.Json(.NET Core 3.0+内置)
using System.Text.Json; // 开启大小写不敏感匹配,避免字段名大小写问题 var options = new JsonSerializerOptions { PropertyNameCaseInsensitive = true }; var usageData = JsonSerializer.Deserialize<UsageDetailsResponse>(data, options); // 遍历计算逻辑和上面一致 if (usageData?.Value != null) { decimal totalCost = usageData.Value.Sum(item => item.Properties.Cost); Console.WriteLine($"周期总费用:{totalCost:C}"); }
三、额外提示
- 如果API返回的字段比示例多,直接在
UsageDetailProperties类里添加对应属性就行,字段名要和JSON返回的一致,或者用特性映射(比如[JsonProperty("resourceGroupName")])。 - 如果
NextLink不为空,说明数据没取完,需要循环调用该链接获取剩余数据,直到NextLink为空。
内容的提问来源于stack exchange,提问作者Mel
相关产品推荐
相关产品推荐

