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

JSON反序列化后List(Of )为空,疑容量超限求验证及扩展方案

解决大JSON反序列化得到空列表的问题

嘿,先给你明确说:你的猜测不对——.NET里的List(Of T)最大容量是Int32.MaxValue(差不多21亿),13万连零头都不到,绝对不是List容量限制导致的问题。下面帮你排查真正原因,以及给出解决方案:

一、先揪出反序列化失败的核心原因

你说少量测试成功、全量数据得到空列表还没异常,大概率是JSON数据不完整/有隐性语法错误,或者反序列化配置忽略了错误。建议先开启错误捕获,把隐性问题暴露出来:

' 配置Newtonsoft.Json的错误处理,强制抛出异常
Dim jsonSettings As New JsonSerializerSettings()
jsonSettings.Error = Sub(sender, e)
                        Console.WriteLine($"反序列化出错位置: {e.ErrorContext.Path}")
                        Console.WriteLine($"错误信息: {e.ErrorContext.Error.Message}")
                        ' 不要忽略错误,让程序抛出异常方便定位
                        e.ErrorContext.Handled = False
                    End Sub

Try
    Dim allDATA As List(Of GeneralInfo) = JsonConvert.DeserializeObject(Of List(Of GeneralInfo))(jstr, jsonSettings)
    ' 反序列化后检查列表数量
    Console.WriteLine($"成功加载{allDATA.Count}条数据")
Catch ex As Exception
    Console.WriteLine($"捕获到异常: {ex.ToString()}")
End Try

运行这段代码,你应该能看到具体的错误提示,比如JSON里某条数据格式不匹配、编码问题,或者jstr本身就没完整读取整个文件。

二、其他可能的原因及排查方向

  1. JSON文件读取不完整:如果你的jstr是通过流读取(比如StreamReader)得到的,有没有确保流完全读完?建议先用File.ReadAllText("你的JSON文件路径")直接读取整个文件,排除读取不完整的问题。
  2. 内存压力过大:13万个GeneralInfo对象,每个里面还有多个FullData,每个FullData又有500条数据,确实会占用不少内存。你可以打开任务管理器观察程序内存占用,如果接近系统内存上限,可能导致CLR隐性终止反序列化过程。这种情况下可以用流式反序列化分批处理,不用一次性加载所有对象到内存:
' 流式读取JSON,逐个处理GeneralInfo对象
Using stream As New FileStream("你的JSON文件路径", FileMode.Open)
Using reader As New JsonTextReader(New StreamReader(stream))
    Dim serializer As New JsonSerializer()
    ' 跳过数组开头的[
    reader.Read()
    
    Dim itemCount As Integer = 0
    While reader.Read()
        ' 遇到数组结尾的]就停止
        If reader.TokenType = JsonToken.EndArray Then
            Exit While
        End If
        
        ' 逐个反序列化单个GeneralInfo
        Dim singleInfo As GeneralInfo = serializer.Deserialize(Of GeneralInfo)(reader)
        itemCount += 1
        ' 这里可以把单个对象存入数据库、写入文件,或者分批加入List(比如每1000条处理一次)
        If itemCount Mod 1000 = 0 Then
            Console.WriteLine($"已处理{itemCount}条数据")
        End If
    End While
End Using
End Using

这种方式内存占用会低很多,不会一次性加载13万对象。
3. Newtonsoft.Json配置问题:有没有设置过NullValueHandling.Ignore或者MissingMemberHandling.Ignore?如果JSON里有和类定义不匹配的字段,默认会忽略,但不会导致整个列表为空,不过还是检查一下配置比较稳妥。

三、关于List(Of T)的扩展

再次明确:你完全不需要扩展List(Of T),它的容量足够容纳你的数据。问题的核心是反序列化过程中的隐性错误或者内存压力,而不是List本身的限制。

内容的提问来源于stack exchange,提问作者ruedi

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.21 03:56:04