2013-01-13 33 views
1

我需要構建一個JObject,它有一個可能包含大量文本的屬性。我從流中讀取了該文本,但我無法弄清楚如何將它寫入一個JToken使用Json.Net,我怎樣才能流很多文本到單個json屬性?

這裏是我試過到目前爲止:

using (var stream = new MemoryStream()) 
{ 
    using (var streamWriter = new StreamWriter(stream)) 
    { 
     // write a lot of random text to the stream 
     var docSize = 1024 * 1024; 
     var rnd = new Random(); 
     for (int i = 0; i < docSize; i++) 
     { 
      var c = (char) rnd.Next('A', 'Z'); 
      streamWriter.Write(c); 
     } 
     streamWriter.Flush(); 
     stream.Seek(0, SeekOrigin.Begin); 

     // read from the stream and write a token 
     using (var streamReader = new StreamReader(stream)) 
     using (var jTokenWriter = new JTokenWriter()) 
     { 
      const int blockSize = 1024; 
      var buffer = new char[blockSize]; 
      while (!streamReader.EndOfStream) 
      { 
       var charsRead = streamReader.Read(buffer, 0, blockSize); 
       var str = new string(buffer, 0, charsRead); 
       jTokenWriter.WriteValue(str); 
      } 

      // add the token to an object 
      var doc = new JObject(); 
      doc.Add("Text", jTokenWriter.Token); 

      // spit out the json for debugging 
      var json = doc.ToString(Formatting.Indented); 
      Debug.WriteLine(json); 
     } 
    } 
} 

這僅僅是一個概念證明。當然,實際上,我會從別處獲取流(例如文件流)。數據可能會非常大 - 數百兆字節。所以僅僅使用字符串是不可能的。

此示例不起作用。只有最後一個塊讀取留在令牌中。我該如何爲令牌寫入一個值,並將它添加到先前寫入的內容而不是替換它?

有沒有更有效的方法來做到這一點?

澄清 - 正在編寫的文本是而不是已經是json格式。它更接近人類可讀的文本。它需要經過與編寫純字符串值時發生的相同的轉義和格式化。

回答

0

經過大量的研究,我相信答案是「它不能做」。

真的,我認爲一個非常大的字符串的單個JValue是要避免的。我將其分解爲存儲在JArray中的較小值。

如果我錯了,請發佈一個更好的答案。謝謝。

相關問題