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

如何用C#读取在线大体积JSON文件中token含BANKNIFTY的指定行

实现方案

完全可以实现,核心思路是用流式HTTP请求+逐节点JSON解析,全程不需要把整个JSON文件加载到内存,内存占用可以控制在KB级别,不会出现系统卡顿问题。


依赖要求

仅需要.NET Core 3.0+ / .NET 5+ 自带的System.Text.Json库,不需要额外安装第三方依赖。


完整可运行代码

using System;
using System.Collections.Generic;
using System.IO;
using System.Net.Http;
using System.Text.Json;
using System.Threading.Tasks;

public static class BankNiftyTokenExtractor
{
    // HttpClient全局单例复用,避免端口耗尽
    private static readonly HttpClient _httpClient = new HttpClient();

    /// <summary>
    /// 流式筛选token以BANKNIFTY开头的条目
    /// </summary>
    /// <param name="jsonUrl">JSON文件在线地址</param>
    /// <returns>匹配的条目列表</returns>
    public static async Task<List<JsonElement>> GetBankNiftyItemsAsync(string jsonUrl)
    {
        var matchedItems = new List<JsonElement>();

        // 启用流式响应,不缓冲整个HTTP响应内容
        using var response = await _httpClient.GetAsync(jsonUrl, HttpCompletionOption.ResponseHeadersRead);
        response.EnsureSuccessStatusCode();
        await using var responseStream = await response.Content.ReadAsStreamAsync();

        // 配置JSON解析器参数
        var readerOptions = new JsonReaderOptions
        {
            AllowTrailingCommas = true,
            CommentHandling = JsonCommentHandling.Skip
        };
        var jsonReader = new Utf8JsonReader(responseStream, readerOptions);

        // 跳过根数组起始标记
        jsonReader.Read();
        if (jsonReader.TokenType != JsonTokenType.StartArray)
        {
            throw new InvalidOperationException("JSON根节点预期为数组格式");
        }

        // 逐节点遍历数组
        while (jsonReader.Read())
        {
            if (jsonReader.TokenType == JsonTokenType.EndArray)
            {
                break;
            }

            if (jsonReader.TokenType == JsonTokenType.StartObject)
            {
                // 仅解析当前单个对象,不加载整个JSON
                var currentItem = JsonElement.ParseValue(ref jsonReader);
                // 匹配token前缀
                if (currentItem.TryGetProperty("token", out var tokenProp)
                    && tokenProp.GetString()?.StartsWith("BANKNIFTY", StringComparison.Ordinal) == true)
                {
                    matchedItems.Add(currentItem);
                    // 如果你只需要token值,直接存tokenProp.GetString()即可,内存占用更低
                }
            }
        }

        return matchedItems;
    }

    // 调用示例
    public static async Task Main(string[] args)
    {
        var targetUrl = "https://margincalculator.angelbroking.com/OpenAPI_File/files/OpenAPIScripMaster.json";
        var result = await GetBankNiftyItemsAsync(targetUrl);
        Console.WriteLine($"共匹配到{result.Count}条符合条件的记录");
        foreach (var item in result)
        {
            Console.WriteLine(item.GetProperty("token").GetString());
        }
    }
}

关键优化说明

  • HttpCompletionOption.ResponseHeadersRead:收到响应头后立即开始处理流,不会把整个文件下载到本地内存缓冲
  • Utf8JsonReader是只进只读的低开销解析器,每次仅加载当前解析节点的内容,即使几十MB的大JSON也不会占用过高内存
  • 不需要完整反序列化所有对象,仅在匹配到需要的字段后再做处理,性能损耗极低

内容的提问来源于stack exchange,提问作者Zerotoinfinity

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.12 08:06:04