将JSON写入流而不缓冲内存中的字符串

时间:2013-08-16 09:20:41

标签: c# .net json io

我想通过显式构建文档来将JSON写入Stream。例如:

var stream = ...;
var writer = new JsonWriter(stream);

writer.BeginArray();
{
  writer.BeginObject();
  {
    writer.String("foo");
    writer.Number(1);
    writer.String("bar");
    writer.Number(2.3);
  }
  writer.EndObject();
}
writer.EndArray();

这会产生:

[
  {
    "foo": 1,
    "bar": 2.3
  }
]

这种方法的好处是不需要在内存中缓冲任何内容。在我的情况下,我在流中写了很多JSON。诸如this one之类的解决方案涉及在内存中创建所有对象,然后将它们序列化为内存中的大字符串,然后最终将此字符串写入流和垃圾收集,可能来自LOH。我希望保持低内存使用率,在从另一个文件/ DB / etc流中读取数据时写出元素。

这种方法可以通过rapidjson library在C ++中使用。

为此我搜索了一下,并没有找到解决方案。

1 个答案:

答案 0 :(得分:14)

原来我需要谷歌更长一段时间。

JSON.NET确实通过其JsonWriter类支持这一点。

我的例子是:

Stream stream = ...;

using (var streamWriter = new StreamWriter(stream))
using (var writer = new JsonTextWriter(streamWriter))
{
    writer.Formatting = Formatting.Indented;

    writer.WriteStartArray();
    {
        writer.WriteStartObject();
        {
            writer.WritePropertyName("foo");
            writer.WriteValue(1);
            writer.WritePropertyName("bar");
            writer.WriteValue(2.3);
        }
        writer.WriteEndObject();
    }
    writer.WriteEndArray();
}