使用NewtonSoft Json.Net解析大型JSON数据

时间:2015-01-22 20:20:54

标签: c# json stream json.net

我正在使用NewtonSoft Json.Net进行一些测试,并且遇到了大型Json数据集的一些问题。

我有一个400MB大小的数据集,似乎无论我如何解析它,我都会一直没有内存异常。我尝试了标准的Parse方法并尝试了解析标记的streamreader方法。无论哪种方式,在某些时候,我最终都会遇到内存异常。

堆栈跟踪表明问题集中在使用Int32索引文档(见下文)。我认为使用JsonTextReader可以解决这个问题,但事实并非如此。

以下是来自服务器的流请求:

public Task<Stream> GetAsync(string command)
{
    Task<Stream> promise;
    using (var handler = new HttpClientHandler { Credentials = new NetworkCredential(username, password) })
    {
        var client = new HttpClient(handler);
        promise = client.GetStreamAsync(command);
    }

    return promise;
}

然后,我以这种方式开始工作:

using (Stream s = task.GetAwaiter().GetResult())
using (StreamReader sr = new StreamReader(s))
using (JsonReader reader = new JsonTextReader(sr))
{
    while (reader.Read())
    {
        if( reader.TokenType == JsonToken.PropertyName && reader.Value.ToString() == "Values" ) {
            reader.Read();
            if( reader.TokenType != JsonToken.StartArray )
                break;
            while( reader.Read() ) {
                // Do more parsing;
            }
        }
    }
}

在Json.net中是否有一些配置我需要设置以避免此问题?或者我是否需要将服务器的响应分解为较小的块?如果是这样,我如何处理部分json?

这是堆栈跟踪:

   at System.String.CtorCharArrayStartLength(Char[] value, Int32 startIndex, Int32 length)
   at Newtonsoft.Json.Utilities.StringReference.ToString()
   at Newtonsoft.Json.JsonTextReader.ParseString(Char quote)
   at Newtonsoft.Json.JsonTextReader.ParseValue()
   at Newtonsoft.Json.JsonTextReader.ReadInternal()
   at Newtonsoft.Json.JsonTextReader.Read()

0 个答案:

没有答案