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

如何用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.25 06:48:50