1

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形式ではありません。人間が読めるテキストに近いです。プレーンな文字列値を書き込んだ場合と同じエスケープとフォーマットを行う必要があります。

4

1 に答える 1

0

いろいろ調べた結果、答えは「できない」と思います。

本当に、非常に大きな文字列の単一の JValue は避けるべきだと思います。代わりに、JArray に格納された小さな値に分割しました。

私が間違っている場合は、より良い回答を投稿してください。ありがとう。

于 2013-01-18T18:10:39.003 に答える