Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -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<byte> propertyName = reader.GetSpan();
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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();
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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!);

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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();
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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();
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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();
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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();
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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();
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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();
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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();
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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();
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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();
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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();
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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();
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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()!;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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();
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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();
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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();
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -33,6 +33,8 @@ internal JsonConverter() { }

internal bool CanBePolymorphic { get; set; }

internal virtual bool SupportsQuotedNumbers => false;

internal abstract JsonPropertyInfo CreateJsonPropertyInfo();

internal abstract JsonParameterInfo CreateJsonParameterInfo();
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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<Type, JsonConverter>? _dictionaryKeyConverters;

private static ConcurrentDictionary<Type, JsonConverter> GetDictionaryKeyConverters()
{
const int NumberOfConverters = 18;
var converters = new ConcurrentDictionary<Type, JsonConverter>(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;
}

/// <summary>
Expand Down