< Summary

Line coverage
0%
Covered lines: 0
Uncovered lines: 71
Coverable lines: 71
Total lines: 114
Line coverage: 0%
Branch coverage
0%
Covered branches: 0
Total branches: 16
Branch coverage: 0%
Method coverage

Feature is only available for sponsors

Upgrade to PRO version

Metrics

MethodBranch coverage Cyclomatic complexity NPath complexity Sequence coverage
.ctor(...)100%110%
OnTryRead(...)0%660%
OnTryWrite(...)0%220%
Read(...)0%220%
Write(...)0%220%
ReadNumberWithCustomHandling(...)0%220%
WriteNumberWithCustomHandling(...)0%220%
GetSupportedJsonValueTypes(...)100%110%

File(s)

https://raw.githubusercontent.com/dotnet/runtime/811a7eabb75c42db53440e8ba3f60c07511cfd1f/src/libraries/System.Text.Json/src/System/Text/Json/Serialization/Converters/Value/NullableConverter.cs

#LineLine coverage
 1// Licensed to the .NET Foundation under one or more agreements.
 2// The .NET Foundation licenses this file to you under the MIT license.
 3
 4using System.Text.Json.Serialization.Metadata;
 5
 6namespace System.Text.Json.Serialization.Converters
 7{
 8    internal sealed class NullableConverter<T> : JsonConverter<T?> where T : struct // Do not rename FQN (legacy schema 
 9    {
 010        internal override Type? ElementType => typeof(T);
 011        internal override JsonConverter? NullableElementConverter => _elementConverter;
 012        public override bool HandleNull => true;
 013        internal override bool CanPopulate => _elementConverter.CanPopulate;
 014        internal override bool ConstructorIsParameterized => _elementConverter.ConstructorIsParameterized;
 15
 16        // It is possible to cache the underlying converter since this is an internal converter and
 17        // an instance is created only once for each JsonSerializerOptions instance.
 18        private readonly JsonConverter<T> _elementConverter; // Do not rename (legacy schema generation)
 19
 020        public NullableConverter(JsonConverter<T> elementConverter)
 021        {
 022            _elementConverter = elementConverter;
 023            IsInternalConverter = elementConverter.IsInternalConverter;
 024            IsInternalConverterForNumberType = elementConverter.IsInternalConverterForNumberType;
 025            ConverterStrategy = elementConverter.ConverterStrategy;
 026            SupportsMultipleTokenTypes = elementConverter.SupportsMultipleTokenTypes;
 027            RequiresReadAhead = elementConverter.RequiresReadAhead;
 028        }
 29
 30        internal override bool OnTryRead(ref Utf8JsonReader reader, Type typeToConvert, JsonSerializerOptions options, s
 031        {
 032            if (!state.IsContinuation && reader.TokenType == JsonTokenType.Null)
 033            {
 034                value = null;
 035                return true;
 36            }
 37
 038            JsonTypeInfo previousTypeInfo = state.Current.JsonTypeInfo;
 039            state.Current.JsonTypeInfo = state.Current.JsonTypeInfo.ElementTypeInfo!;
 040            if (_elementConverter.OnTryRead(ref reader, typeof(T), options, ref state, out T element))
 041            {
 042                value = element;
 043                state.Current.JsonTypeInfo = previousTypeInfo;
 044                return true;
 45            }
 46
 047            state.Current.JsonTypeInfo = previousTypeInfo;
 048            value = null;
 049            return false;
 050        }
 51
 52        internal override bool OnTryWrite(Utf8JsonWriter writer, T? value, JsonSerializerOptions options, ref WriteStack
 053        {
 054            if (value is null)
 055            {
 056                writer.WriteNullValue();
 057                return true;
 58            }
 59
 060            state.Current.JsonPropertyInfo = state.Current.JsonTypeInfo.ElementTypeInfo!.PropertyInfoForTypeInfo;
 061            return _elementConverter.TryWrite(writer, value.Value, options, ref state);
 062        }
 63
 64        public override T? Read(ref Utf8JsonReader reader, Type typeToConvert, JsonSerializerOptions options)
 065        {
 066            if (reader.TokenType == JsonTokenType.Null)
 067            {
 068                return null;
 69            }
 70
 071            T value = _elementConverter.Read(ref reader, typeof(T), options);
 072            return value;
 073        }
 74
 75        public override void Write(Utf8JsonWriter writer, T? value, JsonSerializerOptions options)
 076        {
 077            if (value is null)
 078            {
 079                writer.WriteNullValue();
 080            }
 81            else
 082            {
 083                _elementConverter.Write(writer, value.Value, options);
 084            }
 085        }
 86
 87        internal override T? ReadNumberWithCustomHandling(ref Utf8JsonReader reader, JsonNumberHandling numberHandling, 
 088        {
 089            if (reader.TokenType == JsonTokenType.Null)
 090            {
 091                return null;
 92            }
 93
 094            T value = _elementConverter.ReadNumberWithCustomHandling(ref reader, numberHandling, options);
 095            return value;
 096        }
 97
 98        internal override void WriteNumberWithCustomHandling(Utf8JsonWriter writer, T? value, JsonNumberHandling handlin
 099        {
 0100            if (value is null)
 0101            {
 0102                writer.WriteNullValue();
 0103            }
 104            else
 0105            {
 0106                _elementConverter.WriteNumberWithCustomHandling(writer, value.Value, handling);
 0107            }
 0108        }
 109
 110        internal override JsonValueType GetSupportedJsonValueTypes(JsonNumberHandling numberHandling) =>
 0111            _elementConverter.GetSupportedJsonValueTypes(numberHandling);
 112    }
 113}
 114