我需要构建一个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 格式。它更接近人类可读的文本。如果您编写纯字符串值,它将需要经历相同的转义和格式化。