diff --git a/src/libraries/System.Text.Json/src/System/Text/Json/Serialization/Converters/Value/BooleanConverter.cs b/src/libraries/System.Text.Json/src/System/Text/Json/Serialization/Converters/Value/BooleanConverter.cs index 34601954ef52eb..41ab1a4ae31f6f 100644 --- a/src/libraries/System.Text.Json/src/System/Text/Json/Serialization/Converters/Value/BooleanConverter.cs +++ b/src/libraries/System.Text.Json/src/System/Text/Json/Serialization/Converters/Value/BooleanConverter.cs @@ -17,6 +17,8 @@ public override void Write(Utf8JsonWriter writer, bool value, JsonSerializerOpti writer.WriteBooleanValue(value); } + internal override bool SupportsQuotedNumbers => true; + internal override bool ReadWithQuotes(ref Utf8JsonReader reader) { ReadOnlySpan propertyName = reader.GetSpan(); diff --git a/src/libraries/System.Text.Json/src/System/Text/Json/Serialization/Converters/Value/ByteConverter.cs b/src/libraries/System.Text.Json/src/System/Text/Json/Serialization/Converters/Value/ByteConverter.cs index f02b3ac8d70d50..cf20e0ab83973e 100644 --- a/src/libraries/System.Text.Json/src/System/Text/Json/Serialization/Converters/Value/ByteConverter.cs +++ b/src/libraries/System.Text.Json/src/System/Text/Json/Serialization/Converters/Value/ByteConverter.cs @@ -20,6 +20,8 @@ public override void Write(Utf8JsonWriter writer, byte value, JsonSerializerOpti writer.WriteNumberValue(value); } + internal override bool SupportsQuotedNumbers => true; + internal override byte ReadWithQuotes(ref Utf8JsonReader reader) { return reader.GetByteWithQuotes(); diff --git a/src/libraries/System.Text.Json/src/System/Text/Json/Serialization/Converters/Value/CharConverter.cs b/src/libraries/System.Text.Json/src/System/Text/Json/Serialization/Converters/Value/CharConverter.cs index 73365f70bdcd18..9b5d41dbc8bb43 100644 --- a/src/libraries/System.Text.Json/src/System/Text/Json/Serialization/Converters/Value/CharConverter.cs +++ b/src/libraries/System.Text.Json/src/System/Text/Json/Serialization/Converters/Value/CharConverter.cs @@ -28,6 +28,8 @@ public override void Write(Utf8JsonWriter writer, char value, JsonSerializerOpti ); } + internal override bool SupportsQuotedNumbers => true; + internal override char ReadWithQuotes(ref Utf8JsonReader reader) => Read(ref reader, default!, default!); diff --git a/src/libraries/System.Text.Json/src/System/Text/Json/Serialization/Converters/Value/DateTimeConverter.cs b/src/libraries/System.Text.Json/src/System/Text/Json/Serialization/Converters/Value/DateTimeConverter.cs index 5cf2919d4b25f0..5a08ef5c4a9c5b 100644 --- a/src/libraries/System.Text.Json/src/System/Text/Json/Serialization/Converters/Value/DateTimeConverter.cs +++ b/src/libraries/System.Text.Json/src/System/Text/Json/Serialization/Converters/Value/DateTimeConverter.cs @@ -15,6 +15,8 @@ public override void Write(Utf8JsonWriter writer, DateTime value, JsonSerializer writer.WriteStringValue(value); } + internal override bool SupportsQuotedNumbers => true; + internal override DateTime ReadWithQuotes(ref Utf8JsonReader reader) { return reader.GetDateTimeNoValidation(); diff --git a/src/libraries/System.Text.Json/src/System/Text/Json/Serialization/Converters/Value/DateTimeOffsetConverter.cs b/src/libraries/System.Text.Json/src/System/Text/Json/Serialization/Converters/Value/DateTimeOffsetConverter.cs index 02eae743c63cb1..b0188532af6866 100644 --- a/src/libraries/System.Text.Json/src/System/Text/Json/Serialization/Converters/Value/DateTimeOffsetConverter.cs +++ b/src/libraries/System.Text.Json/src/System/Text/Json/Serialization/Converters/Value/DateTimeOffsetConverter.cs @@ -15,6 +15,8 @@ public override void Write(Utf8JsonWriter writer, DateTimeOffset value, JsonSeri writer.WriteStringValue(value); } + internal override bool SupportsQuotedNumbers => true; + internal override DateTimeOffset ReadWithQuotes(ref Utf8JsonReader reader) { return reader.GetDateTimeOffsetNoValidation(); diff --git a/src/libraries/System.Text.Json/src/System/Text/Json/Serialization/Converters/Value/DecimalConverter.cs b/src/libraries/System.Text.Json/src/System/Text/Json/Serialization/Converters/Value/DecimalConverter.cs index 559079eec617a5..8bb38b6ddff36b 100644 --- a/src/libraries/System.Text.Json/src/System/Text/Json/Serialization/Converters/Value/DecimalConverter.cs +++ b/src/libraries/System.Text.Json/src/System/Text/Json/Serialization/Converters/Value/DecimalConverter.cs @@ -20,6 +20,8 @@ public override void Write(Utf8JsonWriter writer, decimal value, JsonSerializerO writer.WriteNumberValue(value); } + internal override bool SupportsQuotedNumbers => true; + internal override decimal ReadWithQuotes(ref Utf8JsonReader reader) { return reader.GetDecimalWithQuotes(); diff --git a/src/libraries/System.Text.Json/src/System/Text/Json/Serialization/Converters/Value/DoubleConverter.cs b/src/libraries/System.Text.Json/src/System/Text/Json/Serialization/Converters/Value/DoubleConverter.cs index 7b929b10e33974..6bc89a8052a66f 100644 --- a/src/libraries/System.Text.Json/src/System/Text/Json/Serialization/Converters/Value/DoubleConverter.cs +++ b/src/libraries/System.Text.Json/src/System/Text/Json/Serialization/Converters/Value/DoubleConverter.cs @@ -20,6 +20,8 @@ public override void Write(Utf8JsonWriter writer, double value, JsonSerializerOp writer.WriteNumberValue(value); } + internal override bool SupportsQuotedNumbers => true; + internal override double ReadWithQuotes(ref Utf8JsonReader reader) { return reader.GetDoubleWithQuotes(); diff --git a/src/libraries/System.Text.Json/src/System/Text/Json/Serialization/Converters/Value/EnumConverter.cs b/src/libraries/System.Text.Json/src/System/Text/Json/Serialization/Converters/Value/EnumConverter.cs index 81c8e5fd1fec15..859ffd983042cb 100644 --- a/src/libraries/System.Text.Json/src/System/Text/Json/Serialization/Converters/Value/EnumConverter.cs +++ b/src/libraries/System.Text.Json/src/System/Text/Json/Serialization/Converters/Value/EnumConverter.cs @@ -302,6 +302,8 @@ private string FormatEnumValueToString(string value, JavaScriptEncoder? encoder) return converted; } + internal override bool SupportsQuotedNumbers => true; + internal override T ReadWithQuotes(ref Utf8JsonReader reader) { string? enumString = reader.GetString(); diff --git a/src/libraries/System.Text.Json/src/System/Text/Json/Serialization/Converters/Value/GuidConverter.cs b/src/libraries/System.Text.Json/src/System/Text/Json/Serialization/Converters/Value/GuidConverter.cs index 718505619e77aa..82f2ea694eafc3 100644 --- a/src/libraries/System.Text.Json/src/System/Text/Json/Serialization/Converters/Value/GuidConverter.cs +++ b/src/libraries/System.Text.Json/src/System/Text/Json/Serialization/Converters/Value/GuidConverter.cs @@ -15,6 +15,8 @@ public override void Write(Utf8JsonWriter writer, Guid value, JsonSerializerOpti writer.WriteStringValue(value); } + internal override bool SupportsQuotedNumbers => true; + internal override Guid ReadWithQuotes(ref Utf8JsonReader reader) { return reader.GetGuidNoValidation(); diff --git a/src/libraries/System.Text.Json/src/System/Text/Json/Serialization/Converters/Value/Int16Converter.cs b/src/libraries/System.Text.Json/src/System/Text/Json/Serialization/Converters/Value/Int16Converter.cs index f62da456a3a484..43592c34cae2cd 100644 --- a/src/libraries/System.Text.Json/src/System/Text/Json/Serialization/Converters/Value/Int16Converter.cs +++ b/src/libraries/System.Text.Json/src/System/Text/Json/Serialization/Converters/Value/Int16Converter.cs @@ -21,6 +21,8 @@ public override void Write(Utf8JsonWriter writer, short value, JsonSerializerOpt writer.WriteNumberValue((long)value); } + internal override bool SupportsQuotedNumbers => true; + internal override short ReadWithQuotes(ref Utf8JsonReader reader) { return reader.GetInt16WithQuotes(); diff --git a/src/libraries/System.Text.Json/src/System/Text/Json/Serialization/Converters/Value/Int32Converter.cs b/src/libraries/System.Text.Json/src/System/Text/Json/Serialization/Converters/Value/Int32Converter.cs index 85d7fb3c6aa90c..ad202d93a8bb3a 100644 --- a/src/libraries/System.Text.Json/src/System/Text/Json/Serialization/Converters/Value/Int32Converter.cs +++ b/src/libraries/System.Text.Json/src/System/Text/Json/Serialization/Converters/Value/Int32Converter.cs @@ -21,6 +21,8 @@ public override void Write(Utf8JsonWriter writer, int value, JsonSerializerOptio writer.WriteNumberValue((long)value); } + internal override bool SupportsQuotedNumbers => true; + internal override int ReadWithQuotes(ref Utf8JsonReader reader) { return reader.GetInt32WithQuotes(); diff --git a/src/libraries/System.Text.Json/src/System/Text/Json/Serialization/Converters/Value/Int64Converter.cs b/src/libraries/System.Text.Json/src/System/Text/Json/Serialization/Converters/Value/Int64Converter.cs index 48725dccbeecca..f699516b65d826 100644 --- a/src/libraries/System.Text.Json/src/System/Text/Json/Serialization/Converters/Value/Int64Converter.cs +++ b/src/libraries/System.Text.Json/src/System/Text/Json/Serialization/Converters/Value/Int64Converter.cs @@ -20,6 +20,8 @@ public override void Write(Utf8JsonWriter writer, long value, JsonSerializerOpti writer.WriteNumberValue(value); } + internal override bool SupportsQuotedNumbers => true; + internal override long ReadWithQuotes(ref Utf8JsonReader reader) { return reader.GetInt64WithQuotes(); diff --git a/src/libraries/System.Text.Json/src/System/Text/Json/Serialization/Converters/Value/ObjectConverter.cs b/src/libraries/System.Text.Json/src/System/Text/Json/Serialization/Converters/Value/ObjectConverter.cs index cf2992344d1803..04f46f19fc89d1 100644 --- a/src/libraries/System.Text.Json/src/System/Text/Json/Serialization/Converters/Value/ObjectConverter.cs +++ b/src/libraries/System.Text.Json/src/System/Text/Json/Serialization/Converters/Value/ObjectConverter.cs @@ -20,6 +20,8 @@ public override void Write(Utf8JsonWriter writer, object value, JsonSerializerOp throw new InvalidOperationException(); } + internal override bool SupportsQuotedNumbers => true; + internal override object ReadWithQuotes(ref Utf8JsonReader reader) { ThrowHelper.ThrowNotSupportedException_DictionaryKeyTypeNotSupported(TypeToConvert); diff --git a/src/libraries/System.Text.Json/src/System/Text/Json/Serialization/Converters/Value/SByteConverter.cs b/src/libraries/System.Text.Json/src/System/Text/Json/Serialization/Converters/Value/SByteConverter.cs index 0896bf97527ef5..f43e755a8854b4 100644 --- a/src/libraries/System.Text.Json/src/System/Text/Json/Serialization/Converters/Value/SByteConverter.cs +++ b/src/libraries/System.Text.Json/src/System/Text/Json/Serialization/Converters/Value/SByteConverter.cs @@ -20,6 +20,8 @@ public override void Write(Utf8JsonWriter writer, sbyte value, JsonSerializerOpt writer.WriteNumberValue(value); } + internal override bool SupportsQuotedNumbers => true; + internal override sbyte ReadWithQuotes(ref Utf8JsonReader reader) { return reader.GetSByteWithQuotes(); diff --git a/src/libraries/System.Text.Json/src/System/Text/Json/Serialization/Converters/Value/SingleConverter.cs b/src/libraries/System.Text.Json/src/System/Text/Json/Serialization/Converters/Value/SingleConverter.cs index 9b7e6fad328c63..99845f40eaac42 100644 --- a/src/libraries/System.Text.Json/src/System/Text/Json/Serialization/Converters/Value/SingleConverter.cs +++ b/src/libraries/System.Text.Json/src/System/Text/Json/Serialization/Converters/Value/SingleConverter.cs @@ -21,6 +21,8 @@ public override void Write(Utf8JsonWriter writer, float value, JsonSerializerOpt writer.WriteNumberValue(value); } + internal override bool SupportsQuotedNumbers => true; + internal override float ReadWithQuotes(ref Utf8JsonReader reader) { return reader.GetSingleWithQuotes(); diff --git a/src/libraries/System.Text.Json/src/System/Text/Json/Serialization/Converters/Value/StringConverter.cs b/src/libraries/System.Text.Json/src/System/Text/Json/Serialization/Converters/Value/StringConverter.cs index 08972856b698c6..db41783e404114 100644 --- a/src/libraries/System.Text.Json/src/System/Text/Json/Serialization/Converters/Value/StringConverter.cs +++ b/src/libraries/System.Text.Json/src/System/Text/Json/Serialization/Converters/Value/StringConverter.cs @@ -23,6 +23,8 @@ public override void Write(Utf8JsonWriter writer, string? value, JsonSerializerO } } + internal override bool SupportsQuotedNumbers => true; + internal override string ReadWithQuotes(ref Utf8JsonReader reader) { return reader.GetString()!; diff --git a/src/libraries/System.Text.Json/src/System/Text/Json/Serialization/Converters/Value/UInt16Converter.cs b/src/libraries/System.Text.Json/src/System/Text/Json/Serialization/Converters/Value/UInt16Converter.cs index 249d2a059ffa1d..ef181a3d97f8fc 100644 --- a/src/libraries/System.Text.Json/src/System/Text/Json/Serialization/Converters/Value/UInt16Converter.cs +++ b/src/libraries/System.Text.Json/src/System/Text/Json/Serialization/Converters/Value/UInt16Converter.cs @@ -21,6 +21,8 @@ public override void Write(Utf8JsonWriter writer, ushort value, JsonSerializerOp writer.WriteNumberValue((long)value); } + internal override bool SupportsQuotedNumbers => true; + internal override ushort ReadWithQuotes(ref Utf8JsonReader reader) { return reader.GetUInt16WithQuotes(); diff --git a/src/libraries/System.Text.Json/src/System/Text/Json/Serialization/Converters/Value/UInt32Converter.cs b/src/libraries/System.Text.Json/src/System/Text/Json/Serialization/Converters/Value/UInt32Converter.cs index 2c6ea5e07d6b46..8a2e308a94cc73 100644 --- a/src/libraries/System.Text.Json/src/System/Text/Json/Serialization/Converters/Value/UInt32Converter.cs +++ b/src/libraries/System.Text.Json/src/System/Text/Json/Serialization/Converters/Value/UInt32Converter.cs @@ -21,6 +21,8 @@ public override void Write(Utf8JsonWriter writer, uint value, JsonSerializerOpti writer.WriteNumberValue((ulong)value); } + internal override bool SupportsQuotedNumbers => true; + internal override uint ReadWithQuotes(ref Utf8JsonReader reader) { return reader.GetUInt32WithQuotes(); diff --git a/src/libraries/System.Text.Json/src/System/Text/Json/Serialization/Converters/Value/UInt64Converter.cs b/src/libraries/System.Text.Json/src/System/Text/Json/Serialization/Converters/Value/UInt64Converter.cs index 3d94f296de13fe..fc3b3dd896206b 100644 --- a/src/libraries/System.Text.Json/src/System/Text/Json/Serialization/Converters/Value/UInt64Converter.cs +++ b/src/libraries/System.Text.Json/src/System/Text/Json/Serialization/Converters/Value/UInt64Converter.cs @@ -20,6 +20,8 @@ public override void Write(Utf8JsonWriter writer, ulong value, JsonSerializerOpt writer.WriteNumberValue(value); } + internal override bool SupportsQuotedNumbers => true; + internal override ulong ReadWithQuotes(ref Utf8JsonReader reader) { return reader.GetUInt64WithQuotes(); diff --git a/src/libraries/System.Text.Json/src/System/Text/Json/Serialization/JsonConverter.cs b/src/libraries/System.Text.Json/src/System/Text/Json/Serialization/JsonConverter.cs index f8a000ecfeeacc..611366caabaf02 100644 --- a/src/libraries/System.Text.Json/src/System/Text/Json/Serialization/JsonConverter.cs +++ b/src/libraries/System.Text.Json/src/System/Text/Json/Serialization/JsonConverter.cs @@ -33,6 +33,8 @@ internal JsonConverter() { } internal bool CanBePolymorphic { get; set; } + internal virtual bool SupportsQuotedNumbers => false; + internal abstract JsonPropertyInfo CreateJsonPropertyInfo(); internal abstract JsonParameterInfo CreateJsonParameterInfo(); diff --git a/src/libraries/System.Text.Json/src/System/Text/Json/Serialization/JsonSerializerOptions.Converters.cs b/src/libraries/System.Text.Json/src/System/Text/Json/Serialization/JsonSerializerOptions.Converters.cs index cbe8e8f72d1899..315e40ace5cdb3 100644 --- a/src/libraries/System.Text.Json/src/System/Text/Json/Serialization/JsonSerializerOptions.Converters.cs +++ b/src/libraries/System.Text.Json/src/System/Text/Json/Serialization/JsonSerializerOptions.Converters.cs @@ -76,67 +76,13 @@ void Add(JsonConverter converter) => internal JsonConverter GetDictionaryKeyConverter(Type keyType) { - _dictionaryKeyConverters ??= GetDictionaryKeyConverters(); - - if (!_dictionaryKeyConverters.TryGetValue(keyType, out JsonConverter? converter)) + JsonConverter converter = GetConverter(keyType); + if (!converter.SupportsQuotedNumbers) { - if (keyType.IsEnum) - { - converter = GetEnumConverter(); - _dictionaryKeyConverters[keyType] = converter; - } - else - { - ThrowHelper.ThrowNotSupportedException_DictionaryKeyTypeNotSupported(keyType); - } + ThrowHelper.ThrowNotSupportedException_DictionaryKeyTypeNotSupported(keyType); } return converter!; - - // Use factory pattern to generate an EnumConverter with AllowStrings and AllowNumbers options for dictionary keys. - // There will be one converter created for each enum type. - JsonConverter GetEnumConverter() - => (JsonConverter)Activator.CreateInstance( - typeof(EnumConverter<>).MakeGenericType(keyType), - BindingFlags.Instance | BindingFlags.Public, - binder: null, - new object[] { EnumConverterOptions.AllowStrings | EnumConverterOptions.AllowNumbers, this }, - culture: null)!; - } - - private ConcurrentDictionary? _dictionaryKeyConverters; - - private static ConcurrentDictionary GetDictionaryKeyConverters() - { - const int NumberOfConverters = 18; - var converters = new ConcurrentDictionary(Environment.ProcessorCount, NumberOfConverters); - - // When adding to this, update NumberOfConverters above. - Add(s_defaultSimpleConverters[typeof(bool)]); - Add(s_defaultSimpleConverters[typeof(byte)]); - Add(s_defaultSimpleConverters[typeof(char)]); - Add(s_defaultSimpleConverters[typeof(DateTime)]); - Add(s_defaultSimpleConverters[typeof(DateTimeOffset)]); - Add(s_defaultSimpleConverters[typeof(double)]); - Add(s_defaultSimpleConverters[typeof(decimal)]); - Add(s_defaultSimpleConverters[typeof(Guid)]); - Add(s_defaultSimpleConverters[typeof(short)]); - Add(s_defaultSimpleConverters[typeof(int)]); - Add(s_defaultSimpleConverters[typeof(long)]); - Add(s_defaultSimpleConverters[typeof(object)]); - Add(s_defaultSimpleConverters[typeof(sbyte)]); - Add(s_defaultSimpleConverters[typeof(float)]); - Add(s_defaultSimpleConverters[typeof(string)]); - Add(s_defaultSimpleConverters[typeof(ushort)]); - Add(s_defaultSimpleConverters[typeof(uint)]); - Add(s_defaultSimpleConverters[typeof(ulong)]); - - Debug.Assert(NumberOfConverters == converters.Count); - - return converters; - - void Add(JsonConverter converter) => - converters[converter.TypeToConvert] = converter; } ///