如何用JSON.Net反序列化非标准JSON流到自定义MyData类
处理连续独立JSON对象流的反序列化方案
遇到这种非数组格式的连续JSON对象流,直接用常规的JsonConvert.DeserializeObject<List<MyData>>()肯定不行,不过JSON.Net的JsonTextReader专门支持这种场景,只需要开启一个关键配置就行,具体实现步骤如下:
1. 确保类与JSON字段的映射正确
首先你的MyData类需要和JSON里的字段名对应上,因为JSON里是小写的type/time/status,而类属性是大写开头,有两种方式处理:
方式一:使用JsonProperty特性标记
public class MyData { [JsonProperty("type")] public string Type { get; set; } [JsonProperty("time")] public string Time { get; set; } [JsonProperty("status")] public string Status { get; set; } }
方式二:配置序列化器使用驼峰命名解析器
如果不想每个属性加特性,可以在创建JsonSerializer时设置:
var serializer = new JsonSerializer(); serializer.ContractResolver = new CamelCasePropertyNamesContractResolver();
2. 用JsonTextReader逐个读取并反序列化
核心是开启JsonTextReader.SupportMultipleContent = true,这个属性允许读取器处理多个顶级JSON值,然后循环读取每个对象:
using (var stream = /* 你的流对象,比如FileStream、NetworkStream等 */) using (var streamReader = new StreamReader(stream)) using (var jsonReader = new JsonTextReader(streamReader)) { // 关键:允许读取多个独立的JSON对象 jsonReader.SupportMultipleContent = true; var serializer = new JsonSerializer(); var dataList = new List<MyData>(); while (jsonReader.Read()) { // 跳过流中的空白字符(比如换行、空格) if (jsonReader.TokenType == JsonToken.None || jsonReader.TokenType == JsonToken.Undefined) continue; // 逐个反序列化每个JSON对象 var myData = serializer.Deserialize<MyData>(jsonReader); if (myData != null) { dataList.Add(myData); } } // dataList中就是所有反序列化后的对象集合 }
补充说明
- 这种方式是流式处理,不需要把整个流加载到内存里,非常适合处理大体积的数据流
- 如果你的流是异步的,可以用
JsonTextReader的异步方法ReadAsync(),逻辑完全一致 - 要是流里有格式错误的JSON对象,可以在循环里加
try-catch捕获异常,避免整个处理中断
内容的提问来源于stack exchange,提问作者James B
相关产品推荐
相关产品推荐

