如何从超大压缩JSON文件中读取Bbrsaglist数据?
解决超大JSON文件读取Bbrsaglist的问题
核心问题排查与修复
修复entryStream为空的问题
entryStream为空说明你没有正确初始化解压后的文件流。先确认解压逻辑是否正确,以GZIP压缩为例,要确保流处于可读状态且未提前释放:using var fileStream = File.OpenRead("your_compressed_file.gz"); using var entryStream = new GZipStream(fileStream, CompressionMode.Decompress); // 确保后续反序列化代码在using块内,entryStream未被释放修正类型不匹配的异常
无法转换为Queue<Bbrsaglist>的问题,本质是反序列化目标类型与JSON结构不匹配:- 如果JSON外层是包含
Bbrsaglist数组的对象,比如:
需先定义外层容器类,再读取内部数组:{ "Bbrsaglist": [ { "property1": "value1" }, { "property2": "value2" } ] }public class RootContainer { public List<Bbrsaglist> Bbrsaglist { get; set; } } var root = await JsonSerializer.DeserializeAsync<RootContainer>(entryStream); var targetList = root.Bbrsaglist; - 如果JSON本身就是
Bbrsaglist的顶级数组,直接异步枚举单个元素:await foreach (var item in JsonSerializer.DeserializeAsyncEnumerable<Bbrsaglist>(entryStream)) { // 逐个处理item }
注意:不要直接将异步枚举结果赋值给
Queue,如需存入队列,可在遍历过程中添加:var queue = new Queue<Bbrsaglist>(); await foreach (var item in JsonSerializer.DeserializeAsyncEnumerable<Bbrsaglist>(entryStream)) { if (item != null) queue.Enqueue(item); }- 如果JSON外层是包含
正确使用异步枚举器
DeserializeAsyncEnumerable返回的是异步枚举器,必须用await foreach遍历,不能当作普通集合直接操作,否则会出现空枚举或类型转换错误。
额外优化建议
- 防止内存溢出:处理50GB文件时,务必保证每次只加载单个元素,不要一次性将整个集合读入内存。
- 配置反序列化选项:通过
JsonSerializerOptions适配JSON结构细节,避免因大小写、未知属性导致失败:var options = new JsonSerializerOptions { PropertyNameCaseInsensitive = true, IgnoreUnknownFields = true }; await foreach (var item in JsonSerializer.DeserializeAsyncEnumerable<Bbrsaglist>(entryStream, options)) { // 处理逻辑 } - 验证流状态:反序列化前检查
entryStream.CanRead是否为true,确保流处于有效可读状态。
内容的提问来源于stack exchange,提问作者TomGeo
相关产品推荐
相关产品推荐

