Description
#1784 discusses writing raw JSON values when using Utf8JsonWriter
. We can build on top that to support writing raw property names. This could be useful when pre-generating JSON serialization logic and we know the runtime property names ahead of time.
From @Tornhoof in #1784 (comment):
As linked by @layomia for the source-gen code (#53212 (comment)) having a Raw Write functionality could be useful to replace the
JsonEncodedText
members withReadOnlySpan<byte>
and preencoded utf8 member names. At the moment, Benchmarks show thatJsonEncodedText
is faster (10-15%) for writing known property names in json as there is a fastpath for it. For the ROS overload it needs to check the validity of the bytes and possibly escaping. Having a Raw API to bypass the encoding check the performance, should be similar and would allow the source-gen to use ROS.
Benchmarks (also from #1784 (comment))
public class JsonWriteBenchmark
{
private static readonly JsonEncodedText JetPropertyName = JsonEncodedText.Encode("message");
private static ReadOnlySpan<byte> ROSPropertyName =>
new byte[] {0x6D, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65};
[Benchmark]
public void WriteReadOnlySpanPropertyName()
{
using var ms = new MemoryStream();
Utf8JsonWriter writer = new Utf8JsonWriter(ms);
writer.WriteStartObject();
writer.WriteString(ROSPropertyName, "Hello World");
writer.WriteEndObject();
writer.Flush();
}
[Benchmark]
public void WriteJsonEncodedTextPropertyName()
{
using var ms = new MemoryStream();
Utf8JsonWriter writer = new Utf8JsonWriter(ms);
writer.WriteStartObject();
writer.WriteString(JetPropertyName, "Hello World");
writer.WriteEndObject();
writer.Flush();
}
}