ASP.NET Core 3.1 C#实现父JSON中子JSON URL下载转换及按标题拆分
C# ASP.NET Core 3.1 JSON嵌套拉取与拆分实现方案
前置准备
- 注册
IHttpClientFactory服务:在Startup.cs的ConfigureServices方法中添加如下代码,避免直接实例化HttpClient导致的套接字资源耗尽问题:
public void ConfigureServices(IServiceCollection services) { services.AddHttpClient(); // 你的其他服务注册逻辑 }
- 如果你不确定子JSON的结构,直接使用
System.Text.Json自带的JsonElement作为动态类型承载即可,无需额外定义子结构实体类。
实体类定义
根据输入结构定义对应的强类型模型:
// 父级条目模型 public class ParentItem { [JsonPropertyName("title")] public string Title { get; set; } [JsonPropertyName("dates")] public List<DateItem> Dates { get; set; } } // 日期项模型 public class DateItem { [JsonPropertyName("a_date")] public string ADate { get; set; } [JsonPropertyName("push")] public bool Push { get; set; } // 原字段是字符串URL,拉取后替换为JsonElement(支持任意子JSON结构) [JsonPropertyName("date_url")] public object DateUrl { get; set; } }
核心处理逻辑
1. 子JSON拉取与字段替换
public class JsonProcessService { private readonly IHttpClientFactory _httpClientFactory; public JsonProcessService(IHttpClientFactory httpClientFactory) { _httpClientFactory = httpClientFactory; } public async Task<List<ParentItem>> ProcessParentJson(string parentJsonContent) { // 反序列化父JSON var parentItems = JsonSerializer.Deserialize<List<ParentItem>>(parentJsonContent); var httpClient = _httpClientFactory.CreateClient(); // 可选配置超时时间 httpClient.Timeout = TimeSpan.FromSeconds(30); foreach (var parentItem in parentItems) { foreach (var dateItem in parentItem.Dates) { var url = dateItem.DateUrl.ToString(); // 发起请求拉取子JSON var response = await httpClient.GetAsync(url); response.EnsureSuccessStatusCode(); var childJsonContent = await response.Content.ReadAsStringAsync(); // 反序列化为JsonElement替换原有URL字符串 var childJson = JsonSerializer.Deserialize<JsonElement>(childJsonContent); dateItem.DateUrl = childJson; } } return parentItems; } }
2. 可选功能:按title拆分保存为独立JSON文件
public async Task SplitSaveByTitle(List<ParentItem> processedItems, string saveDirPath) { // 确保保存目录存在 if (!Directory.Exists(saveDirPath)) { Directory.CreateDirectory(saveDirPath); } foreach (var item in processedItems) { var fileName = $"{item.Title}.json"; var filePath = Path.Combine(saveDirPath, fileName); // 序列化单个条目为JSON字符串,可配置缩进美化 var jsonContent = JsonSerializer.Serialize(item, new JsonSerializerOptions { WriteIndented = true }); await File.WriteAllTextAsync(filePath, jsonContent); } }
注意事项
- 可以根据需要添加异常处理逻辑,比如URL请求失败时的重试、降级策略
- 如果子JSON结构固定,可定义对应的强类型类替换
JsonElement,获得更好的类型安全 - 并发量大的情况下可以修改为并行拉取子JSON,提升处理效率
内容的提问来源于stack exchange,提问作者Alexander S.
相关产品推荐
相关产品推荐

