<PackageReference Include="System.Text.Json" Version="7.0.0" />

JsonNodeConverter

using System.Text.Json.Nodes; using System.Text.Json.Serialization.Metadata; namespace System.Text.Json.Serialization.Converters { internal sealed class JsonNodeConverter : JsonConverter<JsonNode> { private static JsonNodeConverter s_nodeConverter; private static JsonArrayConverter s_arrayConverter; private static JsonObjectConverter s_objectConverter; private static JsonValueConverter s_valueConverter; public static JsonNodeConverter Instance => s_nodeConverter ?? (s_nodeConverter = new JsonNodeConverter()); public static JsonArrayConverter ArrayConverter => s_arrayConverter ?? (s_arrayConverter = new JsonArrayConverter()); public static JsonObjectConverter ObjectConverter => s_objectConverter ?? (s_objectConverter = new JsonObjectConverter()); public static JsonValueConverter ValueConverter => s_valueConverter ?? (s_valueConverter = new JsonValueConverter()); public override void Write(Utf8JsonWriter writer, JsonNode value, JsonSerializerOptions options) { if (value == null) writer.WriteNullValue(); else { JsonValue jsonValue = value as JsonValue; if (jsonValue != null) ValueConverter.Write(writer, jsonValue, options); else { JsonObject jsonObject = value as JsonObject; if (jsonObject != null) ObjectConverter.Write(writer, jsonObject, options); else ArrayConverter.Write(writer, (JsonArray)value, options); } } } public override JsonNode Read(ref Utf8JsonReader reader, Type typeToConvert, JsonSerializerOptions options) { switch (reader.TokenType) { case JsonTokenType.String: case JsonTokenType.Number: case JsonTokenType.True: case JsonTokenType.False: return ValueConverter.Read(ref reader, typeToConvert, options); case JsonTokenType.StartObject: return ObjectConverter.Read(ref reader, typeToConvert, options); case JsonTokenType.StartArray: return ArrayConverter.Read(ref reader, typeToConvert, options); default: throw new JsonException(); } } public static JsonNode Create(JsonElement element, JsonNodeOptions? options) { switch (element.ValueKind) { case JsonValueKind.Null: return null; case JsonValueKind.Object: return new JsonObject(element, options); case JsonValueKind.Array: return new JsonArray(element, options); default: return new JsonValueTrimmable<JsonElement>(element, JsonMetadataServices.JsonElementConverter, options); } } } }