/// <summary> /// Creates a <see cref="JsonConverter{T}"/> instance that converts <typeparamref name="T?"/> values. /// </summary> /// <typeparam name="T">The generic definition for the underlying nullable type.</typeparam> /// <param name="options">The <see cref="JsonSerializerOptions"/> to use for serialization and deserialization.</param> /// <returns>A <see cref="JsonConverter{T}"/> instance that converts <typeparamref name="T?"/> values</returns> /// <remarks>This API is for use by the output of the System.Text.Json source generator and should not be called directly.</remarks> public static JsonConverter <T?> GetNullableConverter <T>(JsonSerializerOptions options) where T : struct { if (options is null) { ThrowHelper.ThrowArgumentNullException(nameof(options)); } JsonConverter <T> underlyingConverter = GetTypedConverter <T>(options.GetConverterFromTypeInfo(typeof(T))); return(new NullableConverter <T>(underlyingConverter)); }
internal override void WriteAsPropertyNameCore(Utf8JsonWriter writer, object?value, JsonSerializerOptions options, bool isWritingExtensionDataProperty) { // This converter does not handle nulls. Debug.Assert(value != null); Type runtimeType = value.GetType(); JsonConverter runtimeConverter = options.GetConverterFromTypeInfo(runtimeType); if (runtimeConverter == this) { ThrowHelper.ThrowNotSupportedException_DictionaryKeyTypeNotSupported(runtimeType, this); } runtimeConverter.WriteAsPropertyNameCoreAsObject(writer, value, options, isWritingExtensionDataProperty); }
public override JsonConverter CreateConverter(Type typeToConvert, JsonSerializerOptions options) { Debug.Assert(typeToConvert.GetGenericArguments().Length > 0); Type valueTypeToConvert = typeToConvert.GetGenericArguments()[0]; JsonConverter valueConverter = options.GetConverterFromTypeInfo(valueTypeToConvert); Debug.Assert(valueConverter != null); // If the value type has an interface or object converter, just return that converter directly. if (!valueConverter.TypeToConvert.IsValueType && valueTypeToConvert.IsValueType) { return(valueConverter); } return(CreateValueConverter(valueTypeToConvert, valueConverter)); }