< Summary

Information
Class: System.Text.Json.Serialization.Converters.NullableConverter<T>
Assembly: System.Text.Json
File(s): C:\h\w\B31A098C\w\BB5A0A33\e\runtime-utils\Runner\runtime\src\libraries\System.Text.Json\src\System\Text\Json\Serialization\Converters\Value\NullableConverter.cs
Line coverage
0%
Covered lines: 0
Uncovered lines: 68
Coverable lines: 68
Total lines: 108
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%

File(s)

C:\h\w\B31A098C\w\BB5A0A33\e\runtime-utils\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        }
 27
 28        internal override bool OnTryRead(ref Utf8JsonReader reader, Type typeToConvert, JsonSerializerOptions options, s
 029        {
 030            if (!state.IsContinuation && reader.TokenType == JsonTokenType.Null)
 031            {
 032                value = null;
 033                return true;
 34            }
 35
 036            JsonTypeInfo previousTypeInfo = state.Current.JsonTypeInfo;
 037            state.Current.JsonTypeInfo = state.Current.JsonTypeInfo.ElementTypeInfo!;
 038            if (_elementConverter.OnTryRead(ref reader, typeof(T), options, ref state, out T element))
 039            {
 040                value = element;
 041                state.Current.JsonTypeInfo = previousTypeInfo;
 042                return true;
 43            }
 44
 045            state.Current.JsonTypeInfo = previousTypeInfo;
 046            value = null;
 047            return false;
 048        }
 49
 50        internal override bool OnTryWrite(Utf8JsonWriter writer, T? value, JsonSerializerOptions options, ref WriteStack
 051        {
 052            if (value is null)
 053            {
 054                writer.WriteNullValue();
 055                return true;
 56            }
 57
 058            state.Current.JsonPropertyInfo = state.Current.JsonTypeInfo.ElementTypeInfo!.PropertyInfoForTypeInfo;
 059            return _elementConverter.TryWrite(writer, value.Value, options, ref state);
 060        }
 61
 62        public override T? Read(ref Utf8JsonReader reader, Type typeToConvert, JsonSerializerOptions options)
 063        {
 064            if (reader.TokenType == JsonTokenType.Null)
 065            {
 066                return null;
 67            }
 68
 069            T value = _elementConverter.Read(ref reader, typeof(T), options);
 070            return value;
 071        }
 72
 73        public override void Write(Utf8JsonWriter writer, T? value, JsonSerializerOptions options)
 074        {
 075            if (value is null)
 076            {
 077                writer.WriteNullValue();
 078            }
 79            else
 080            {
 081                _elementConverter.Write(writer, value.Value, options);
 082            }
 083        }
 84
 85        internal override T? ReadNumberWithCustomHandling(ref Utf8JsonReader reader, JsonNumberHandling numberHandling, 
 086        {
 087            if (reader.TokenType == JsonTokenType.Null)
 088            {
 089                return null;
 90            }
 91
 092            T value = _elementConverter.ReadNumberWithCustomHandling(ref reader, numberHandling, options);
 093            return value;
 094        }
 95
 96        internal override void WriteNumberWithCustomHandling(Utf8JsonWriter writer, T? value, JsonNumberHandling handlin
 097        {
 098            if (value is null)
 099            {
 0100                writer.WriteNullValue();
 0101            }
 102            else
 0103            {
 0104                _elementConverter.WriteNumberWithCustomHandling(writer, value.Value, handling);
 0105            }
 0106        }
 107    }
 108}