Az Utf8JsonWriter használata System.Text.Json
Ez a cikk bemutatja, hogyan használható a Utf8JsonWriter típus egyéni szerializálók készítéséhez.
Utf8JsonWriteraz UTF-8 kódolású JSON-szövegek írásának nagy teljesítményű módja a gyakori .NET-típusokból, például String
a DateTime
. Int32
Az író egy alacsony szintű típus, amely egyéni szerializálók készítésére használható. A JsonSerializer.Serialize módszer a fedelek alatt használja Utf8JsonWriter
.
Az alábbi példa az osztály használatát Utf8JsonWriter mutatja be:
var options = new JsonWriterOptions
{
Indented = true
};
using var stream = new MemoryStream();
using var writer = new Utf8JsonWriter(stream, options);
writer.WriteStartObject();
writer.WriteString("date", DateTimeOffset.UtcNow);
writer.WriteNumber("temp", 42);
writer.WriteEndObject();
writer.Flush();
string json = Encoding.UTF8.GetString(stream.ToArray());
Console.WriteLine(json);
Dim options As JsonWriterOptions = New JsonWriterOptions With {
.Indented = True
}
Dim stream As MemoryStream = New MemoryStream
Dim writer As Utf8JsonWriter = New Utf8JsonWriter(stream, options)
writer.WriteStartObject()
writer.WriteString("date", DateTimeOffset.UtcNow)
writer.WriteNumber("temp", 42)
writer.WriteEndObject()
writer.Flush()
Dim json As String = Encoding.UTF8.GetString(stream.ToArray())
Console.WriteLine(json)
Írás UTF-8 szöveggel
A lehető legjobb teljesítmény elérése érdekében az Utf8JsonWriter
UTF-16 sztringek helyett már UTF-8 szövegként kódolt JSON-hasznos adatok írása. Az JsonEncodedText ismert sztringtulajdonságok neveit és értékeit statikusként gyorsítótárazhatja és előre kódolhatja, és UTF-16 sztringkonstansok helyett továbbíthatja azokat az írónak. Ez gyorsabb, mint az UTF-8 bájttömbök gyorsítótárazása és használata.
Ez a módszer akkor is működik, ha egyéni menekülést kell végrehajtania. System.Text.Json
sztring írása közben nem tilthatja le a menekülést. A saját egyéni beállításokat JavaScriptEncoder azonban átadhatja az írónak, vagy létrehozhatja a sajátját JsonEncodedText
, amely a meneküléshez használja JavascriptEncoder
, majd a sztring helyett írja be a JsonEncodedText
sajátját. További információ: Karakterkódolás testreszabása.
Nyers JSON írása
Bizonyos esetekben érdemes lehet "nyers" JSON-t írni egy JSON-hasznos adatba, amellyel Utf8JsonWriter
létrehoz. Erre használhatja Utf8JsonWriter.WriteRawValue . Íme néhány tipikus forgatókönyv:
Van egy meglévő JSON-hasznos adata, amelyet az új JSON-ba szeretne belefoglalni.
Az értékeket az alapértelmezett
Utf8JsonWriter
formázástól eltérően szeretné formázni.Előfordulhat például, hogy testre szeretné szabni a számformázást. Alapértelmezés szerint System.Text.Json kihagyja a tizedesvesszőt egész számok esetében, például írás
1
helyett1.0
. Az ok az, hogy kevesebb bájt írása jó a teljesítményhez. Tegyük fel azonban, hogy a JSON-felhasználó a számokat tizedesjellel, a tizedesjel nélküli számokat pedig egész számként kezeli. Érdemes lehet meggyőződni arról, hogy a tömbben lévő számok mindegyike kettősként van felismerve, ha egész számokhoz tizedesvesszőt és nullát ír. Az alábbi példa bemutatja, hogyan teheti ezt meg:using System.Text; using System.Text.Json; namespace WriteRawJson; public class Program { public static void Main() { JsonWriterOptions writerOptions = new() { Indented = true, }; using MemoryStream stream = new(); using Utf8JsonWriter writer = new(stream, writerOptions); writer.WriteStartObject(); writer.WriteStartArray("defaultJsonFormatting"); foreach (double number in new double[] { 50.4, 51 }) { writer.WriteStartObject(); writer.WritePropertyName("value"); writer.WriteNumberValue(number); writer.WriteEndObject(); } writer.WriteEndArray(); writer.WriteStartArray("customJsonFormatting"); foreach (double result in new double[] { 50.4, 51 }) { writer.WriteStartObject(); writer.WritePropertyName("value"); writer.WriteRawValue( FormatNumberValue(result), skipInputValidation: true); writer.WriteEndObject(); } writer.WriteEndArray(); writer.WriteEndObject(); writer.Flush(); string json = Encoding.UTF8.GetString(stream.ToArray()); Console.WriteLine(json); } static string FormatNumberValue(double numberValue) { return numberValue == Convert.ToInt32(numberValue) ? numberValue.ToString() + ".0" : numberValue.ToString(); } } // output: //{ // "defaultJsonFormatting": [ // { // "value": 50.4 // }, // { // "value": 51 // } // ], // "customJsonFormatting": [ // { // "value": 50.4 // }, // { // "value": 51.0 // } // ] //}
A karakterek szökésének testreszabása
A StringEscapeHandling beállítás az JsonTextWriter
összes nem ASCII-karaktert vagy HTML-karaktert elkerülő lehetőségeket kínál. Alapértelmezés szerint Utf8JsonWriter
az összes nem ASCII - és HTML-karaktert feloldja. Ez a menekülés védelmi okokból történik. Egy másik menekülési szabályzat megadásához hozzon létre egy és állítsa be a következőt JavaScriptEncoderJsonWriterOptions.Encoder: További információ: Karakterkódolás testreszabása.
Null értékek írása
Null értékek írásához hívja Utf8JsonWriter
meg a következőt:
- WriteNull kulcs-érték pár megírása null értékkel.
- WriteNullValue null érték írása JSON-tömb elemeként.
Sztringtulajdonság esetén, ha a sztring null értékű, WriteString és WriteStringValue megegyezik a következővel WriteNull
: és WriteNullValue
.
Írási idő, Uri vagy karakterértékek
Az íráshoz és az értékek formázásához formázza őket sztringekként (például hívássalToString()
) és híváskéntWriteStringValue.char
Timespan
Uri
Lásd még
Visszajelzés
https://aka.ms/ContentUserFeedback.
Hamarosan elérhető: 2024-ben fokozatosan kivezetjük a GitHub-problémákat a tartalom visszajelzési mechanizmusaként, és lecseréljük egy új visszajelzési rendszerre. További információ:Visszajelzés küldése és megtekintése a következőhöz: