JObject
非常に大量のテキストを含む可能性のある単一のプロパティを持つを構築する必要があります。このテキストをストリームから読み取っていますが、単一のに書き込む方法がわかりませんJToken
。
これが私がこれまでに試したことです:
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形式ではありません。人間が読めるテキストに近いです。プレーンな文字列値を書き込んだ場合と同じエスケープとフォーマットを行う必要があります。