2013-01-16 80 views
1

當我嘗試解析大小爲200mb的大文件json時,出現問題。 我正在使用Newtonsoft.Json。它給出了OutOfMemory例外。內存不足用於JObject

這是我的代碼:

using (StreamReader sr=File.OpenText("path")) 
     { 
      JObject file= (JObject)JToken.ReadFrom(new JsonTextReader(sr)); 
     } 

我怎樣才能做到這一點? (最好使用JObject)

回答

2

您可以使用JsonTextReader在這個問題說的DataReader時尚閱讀的文本:

Incremental JSON Parsing in C#

您必須編寫自己的邏輯來處理JSON數據,但它肯定會解決你的內存問題:

using (var reader = new JsonTextReader(File.OpenText("path"))) 
{ 
    while (reader.Read()) 
    { 
     // Your logic here (anything you need is in [reader] object), for instance: 
     if (reader.TokenType == JsonToken.StartArray) 
     { 
      // Process array 
      MyMethodToProcessArray(reader); 
     } 
     else if (reader.TokenType == JsonToken.StartObject) 
     { 
      // Process object 
      MyMethodToProcessObject(reader); 
     } 
    } 
} 

你實際上會建立一個遞歸的JSON解析器。

+0

它似乎var property = jsonReader.TokenType.PropertyName;不起作用。它說'PropertyName不能用實例引用訪問;使用類型名稱代替' – Kosmog

+1

我更新了答案並添加了一些示例代碼。使用JsonTextReader就像創建一個從頭開始的解析器(如果你的JSON結構很複雜,那麼工作量很大),但如果你對此感到滿意,它可以讓你避免內存問題。 –

+0

謝謝。但是,我怎樣才能訪問該文件中的字段?對於較小的json文件,我會這樣做:我會創建一個JObject並遍歷它,並且我可以訪問像這個元素[「field_name」]這樣的元素,值爲()。我怎樣才能與讀者做到這一點? – Kosmog