< Summary

Information
Class: System.Text.Json.Serialization.Converters.NullableConverter<T>
Assembly: System.Text.Json
File(s): D:\runner\runtime\src\libraries\System.Text.Json\src\System\Text\Json\Serialization\Converters\Value\NullableConverter.cs
Line coverage
0%
Covered lines: 0
Uncovered lines: 72
Coverable lines: 72
Total lines: 115
Line coverage: 0%
Branch coverage
0%
Covered branches: 0
Total branches: 18
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%880%
OnTryWrite(...)0%220%
Read(...)0%220%
Write(...)0%220%
ReadNumberWithCustomHandling(...)0%220%
WriteNumberWithCustomHandling(...)0%220%
GetSupportedJsonValueTypes(...)100%110%

File(s)

D:\runner\runtime\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        {
 32            // IsContinuation can be false when resuming the last suspended frame.
 033            if (!state.IsContinuation && reader.TokenType == JsonTokenType.Null &&
 034                state.Current.ObjectState == StackFrameObjectState.None)
 035            {
 036                value = null;
 037                return true;
 38            }
 39
 040            JsonTypeInfo previousTypeInfo = state.Current.JsonTypeInfo;
 041            state.Current.JsonTypeInfo = state.Current.JsonTypeInfo.ElementTypeInfo!;
 042            if (_elementConverter.OnTryRead(ref reader, typeof(T), options, ref state, out T element))
 043            {
 044                value = element;
 045                state.Current.JsonTypeInfo = previousTypeInfo;
 046                return true;
 47            }
 48
 049            state.Current.JsonTypeInfo = previousTypeInfo;
 050            value = null;
 051            return false;
 052        }
 53
 54        internal override bool OnTryWrite(Utf8JsonWriter writer, T? value, JsonSerializerOptions options, ref WriteStack
 055        {
 056            if (value is null)
 057            {
 058                writer.WriteNullValue();
 059                return true;
 60            }
 61
 062            state.Current.JsonPropertyInfo = state.Current.JsonTypeInfo.ElementTypeInfo!.PropertyInfoForTypeInfo;
 063            return _elementConverter.TryWrite(writer, value.Value, options, ref state);
 064        }
 65
 66        public override T? Read(ref Utf8JsonReader reader, Type typeToConvert, JsonSerializerOptions options)
 067        {
 068            if (reader.TokenType == JsonTokenType.Null)
 069            {
 070                return null;
 71            }
 72
 073            T value = _elementConverter.Read(ref reader, typeof(T), options);
 074            return value;
 075        }
 76
 77        public override void Write(Utf8JsonWriter writer, T? value, JsonSerializerOptions options)
 078        {
 079            if (value is null)
 080            {
 081                writer.WriteNullValue();
 082            }
 83            else
 084            {
 085                _elementConverter.Write(writer, value.Value, options);
 086            }
 087        }
 88
 89        internal override T? ReadNumberWithCustomHandling(ref Utf8JsonReader reader, JsonNumberHandling numberHandling, 
 090        {
 091            if (reader.TokenType == JsonTokenType.Null)
 092            {
 093                return null;
 94            }
 95
 096            T value = _elementConverter.ReadNumberWithCustomHandling(ref reader, numberHandling, options);
 097            return value;
 098        }
 99
 100        internal override void WriteNumberWithCustomHandling(Utf8JsonWriter writer, T? value, JsonNumberHandling handlin
 0101        {
 0102            if (value is null)
 0103            {
 0104                writer.WriteNullValue();
 0105            }
 106            else
 0107            {
 0108                _elementConverter.WriteNumberWithCustomHandling(writer, value.Value, handling);
 0109            }
 0110        }
 111
 112        internal override JsonValueType GetSupportedJsonValueTypes(JsonNumberHandling numberHandling) =>
 0113            _elementConverter.GetSupportedJsonValueTypes(numberHandling);
 114    }
 115}