You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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.

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.12 12:27:04