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.