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

Dre*_*kes 9 .net c# io json

我想Stream通过显式构建文档来编写JSON .例如:

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();
Run Code Online (Sandbox Code Playgroud)

这会产生:

[
  {
    "foo": 1,
    "bar": 2.3
  }
]
Run Code Online (Sandbox Code Playgroud)

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

这种方法可以通过rapidjson库在C++中使用.

我已经搜索了很多,但没有找到解决方案.

Dre*_*kes 17

结果我需要谷歌更长一点.

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();
}
Run Code Online (Sandbox Code Playgroud)

  • @ I4V - `{}`是为了便于阅读,是可选的.在一个非平凡的例子中,他们可以提供帮助.如果要按照简单的重复格式编写许多很多元素,手动编写元素是个好主意.例如,如果您使用来自`SqlDataReader`的100,000个元素将JSON写入HTTP响应流,则以这种方式编写可以避免命中"OutOfMemoryException",即使您没有OOME,您的Web服务器也会表现得更好.所以,这取决于你的情况的要求. (3认同)
  • @I4V 此外,这是一种更高效的方法。序列化总是需要很多开销。通过仅手动写入必要的数据,您可以避免大量工作。毕竟自动序列化确实需要检查某些属性并分析对象的结构,这比手动编写它花费的时间要多得多。在我的项目中,我确实手动编写我的文件,因为它可能需要很长时间才能处理大量数据。抱歉,我知道这个线程很旧。但我认为这是值得一提的。 (2认同)