| File: System\Text\Json\Nodes\JsonValueOfTPrimitive.cs | Web Access |
| Project: src\runtime\src\libraries\System.Text.Json\src\System.Text.Json.csproj (System.Text.Json) |
// Licensed to the .NET Foundation under one or more agreements. // The .NET Foundation licenses this file to you under the MIT license. using System.Collections.Generic; using System.Diagnostics; using System.Text.Json.Serialization; namespace System.Text.Json.Nodes { /// <summary> /// A JsonValue encapsulating a primitive value using a built-in converter for the type. /// </summary> internal sealed class JsonValuePrimitive<TValue> : JsonValue<TValue> { private readonly JsonConverter<TValue> _converter; private readonly JsonValueKind _valueKind; public JsonValuePrimitive(TValue value, JsonConverter<TValue> converter, JsonNodeOptions? options) : base(value, options) { Debug.Assert(TypeIsSupportedPrimitive, $"The type {typeof(TValue)} is not a supported primitive."); Debug.Assert(converter is { IsInternalConverter: true, ConverterStrategy: ConverterStrategy.Value }); _converter = converter; _valueKind = DetermineValueKind(value); } private protected override JsonValueKind GetValueKindCore() => _valueKind; internal override JsonNode DeepCloneCore() => new JsonValuePrimitive<TValue>(Value, _converter, Options); internal override bool DeepEqualsCore(JsonNode otherNode) { if (otherNode is JsonValue otherValue && otherValue.TryGetValue(out TValue? v)) { // Because TValue is equatable and otherNode returns a matching // type we can short circuit the comparison in this case. return EqualityComparer<TValue>.Default.Equals(Value, v); } return base.DeepEqualsCore(otherNode); } public override void WriteTo(Utf8JsonWriter writer, JsonSerializerOptions? options = null) { ArgumentNullException.ThrowIfNull(writer); JsonConverter<TValue> converter = _converter; options ??= s_defaultOptions; if (converter.IsInternalConverterForNumberType) { converter.WriteNumberWithCustomHandling(writer, Value, options.NumberHandling); } else { converter.Write(writer, Value, options); } } } }