Writing JSON to a stream without buffering the string in memory

.net, c#, io, json

Solution

Turns out I needed to Google for a bit longer.

JSON.NET does indeed support this via its `JsonWriter` class.

My example would be written:

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();
}

Problem

I would like to write JSON to a `Stream` by building the document up explicitly. For example: ``` 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(); ``` This would produce: ``` [ { "foo": 1, "bar": 2.3 } ] ``` The benefit of this approach is that nothing needs to be buffered in memory. In my situation, I'm writing quite a lot of JSON to the stream. Solutions such as this one involve creating all your objects in memory, then serialising them to a large string in memory, then finally writing this string to the stream and garbage collecting, probably from the LOH. I want to keep my memory use low, writing out elements while reading data from another file/DB/etc stream. This kind of approach is available in C++ via the rapidjson library. I've searched around a fair bit for this and haven't found a solution.

Original source

Related problems