如何用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
相关产品推荐
相关产品推荐

