.NET的System.Text.Json是否有类似Newtonsoft.Json的JsonReader/JsonTextReader?
System.Text.Json 处理超大JSON文件的流读取方案
完全可以,System.Text.Json 提供了 Utf8JsonReader 类型,专门用于以流的方式顺序读取JSON数据,不需要将整个文件加载到内存,完美适配数十GB级的超大JSON文件场景,完全符合你不依赖外部库的需求。
它的设计逻辑和Newtonsoft.Json的JsonReader/JsonTextReader一致,都是通过逐Token读取的方式处理JSON结构,核心用法如下:
示例代码
using var stream = new FileStream("large-file.json", FileMode.Open, FileAccess.Read, FileShare.Read, bufferSize: 4096); var reader = new Utf8JsonReader(stream); while (reader.Read()) { // 根据当前Token类型处理对应逻辑 switch (reader.TokenType) { case JsonTokenType.StartObject: // 处理对象开始标记 break; case JsonTokenType.PropertyName: string propName = reader.GetString(); // 处理属性名称 break; case JsonTokenType.String: string strValue = reader.GetString(); // 处理字符串类型的属性值 break; case JsonTokenType.Number: if (reader.TryGetInt64(out long intValue)) { // 处理整数类型值 } // 也可以根据需求尝试读取其他数值类型 break; case JsonTokenType.EndObject: // 处理对象结束标记 break; // 其他Token类型可根据业务需求扩展处理 } }
关键说明
- Utf8JsonReader 是值类型,无需用
using包裹,它不会持有Stream资源,资源管理由外层的Stream负责。 - 直接接收Stream作为输入,无需像Newtonsoft那样包装为StreamReader,因为它直接操作UTF-8字节流,性能更高。
- 通过
Read()方法逐个推进JSON Token,每次仅在内存中保留当前Token的相关数据,内存占用极低。 - 提供了一系列类型安全的读取方法(如
GetString()、TryGetInt64()等),避免类型转换错误。
内容的提问来源于stack exchange,提问作者smk081
相关产品推荐
相关产品推荐

