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.
Speed up serialization Because ArduinoJson writes bytes one by one, WiFiClient spends a lot of time sending small packets. To speed up your program, you need to insert a buffer between serializeJson() and WiFiClient . You can do that using the StreamUtils library.
JSON streaming comprises communications protocols to delimit JSON objects built upon lower-level stream-oriented protocols (such as TCP), that ensures individual JSON objects are recognized, when the server and clients use the same one (e.g. implicitly coded in).
There are some excellent libraries for parsing large JSON files with minimal resources. One is the popular GSON library. It gets at the same effect of parsing the file as both stream and object. It handles each record as it passes, then discards the stream, keeping memory usage low.
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();
}
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With