Skip to content

Commit 39c5f5e

Browse files
committed
Code review.
1 parent c0c6180 commit 39c5f5e

File tree

2 files changed

+16
-9
lines changed

2 files changed

+16
-9
lines changed

ClassLibraries/Macross.Json.Extensions/Code/System.Text.Json.Serialization/JsonStringEnumMemberConverterHelper.cs

Lines changed: 11 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,5 @@
11
using System.Collections.Generic;
22
using System.Reflection;
3-
using System.Runtime.CompilerServices;
43
using System.Runtime.Serialization;
54
using System.Globalization;
65

@@ -34,6 +33,7 @@ public EnumInfo(string name, TEnum enumValue, ulong rawValue)
3433
#endif
3534

3635
private readonly bool _AllowIntegerValues;
36+
private readonly ulong? _DeserializationFailureFallbackValueRaw;
3737
private readonly TEnum? _DeserializationFailureFallbackValue;
3838
private readonly Type _EnumType;
3939
private readonly TypeCode _EnumTypeCode;
@@ -80,7 +80,10 @@ public JsonStringEnumMemberConverterHelper(JsonStringEnumMemberConverterOptions?
8080
throw new NotSupportedException();
8181

8282
if (deserializationFailureFallbackValue.HasValue && rawValue == deserializationFailureFallbackValue)
83+
{
84+
_DeserializationFailureFallbackValueRaw = deserializationFailureFallbackValue;
8385
_DeserializationFailureFallbackValue = typedValue;
86+
}
8487

8588
_RawToTransformed[typedValue] = new EnumInfo(transformedName, typedValue, rawValue);
8689
_TransformedToRaw[transformedName] = new EnumInfo(name, typedValue, rawValue);
@@ -133,7 +136,12 @@ public TEnum Read(ref Utf8JsonReader reader)
133136
}
134137

135138
if (!matched)
136-
return ReturnDefaultValueOrThrowJsonException(flagValue);
139+
{
140+
if (_DeserializationFailureFallbackValueRaw.HasValue)
141+
calculatedValue |= _DeserializationFailureFallbackValueRaw.Value;
142+
else
143+
throw ThrowHelper.GenerateJsonException_DeserializeUnableToConvertValue(_EnumType, flagValue);
144+
}
137145
}
138146
}
139147

@@ -154,7 +162,7 @@ public TEnum Read(ref Utf8JsonReader reader)
154162
}
155163
}
156164

157-
return ReturnDefaultValueOrThrowJsonException(enumString);
165+
return _DeserializationFailureFallbackValue ?? throw ThrowHelper.GenerateJsonException_DeserializeUnableToConvertValue(_EnumType, enumString);
158166
}
159167

160168
if (token != JsonTokenType.Number || !_AllowIntegerValues)
@@ -298,9 +306,5 @@ public void Write(Utf8JsonWriter writer, TEnum value)
298306
throw new JsonException(); // GetEnumValue should have already thrown.
299307
}
300308
}
301-
302-
[MethodImpl(MethodImplOptions.AggressiveInlining)]
303-
private TEnum ReturnDefaultValueOrThrowJsonException(string propertyValue)
304-
=> _DeserializationFailureFallbackValue ?? throw ThrowHelper.GenerateJsonException_DeserializeUnableToConvertValue(_EnumType, propertyValue);
305309
}
306310
}

ClassLibraries/Macross.Json.Extensions/Test/JsonStringEnumMemberConverterTests.cs

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -55,10 +55,13 @@ public void EnumMemberInvalidDeserializationWithFallbackTest()
5555
CollectionAssert.AreEqual(new DayOfWeek[] { DayOfWeek.Friday, DayOfWeek.Saturday }, days);
5656

5757
Options = new JsonSerializerOptions();
58-
Options.Converters.Add(new JsonStringEnumMemberConverter(new JsonStringEnumMemberConverterOptions { DeserializationFailureFallbackValue = FlagDefinitions.None }));
58+
Options.Converters.Add(new JsonStringEnumMemberConverter(new JsonStringEnumMemberConverterOptions { DeserializationFailureFallbackValue = FlagDefinitions.Four }));
5959

6060
FlagDefinitions Value = JsonSerializer.Deserialize<FlagDefinitions>(@"""invalid_value""", Options);
61-
Assert.AreEqual(FlagDefinitions.None, Value);
61+
Assert.AreEqual(FlagDefinitions.Four, Value);
62+
63+
Value = JsonSerializer.Deserialize<FlagDefinitions>(@"""one value, invalid_value, two value""", Options);
64+
Assert.AreEqual(FlagDefinitions.One | FlagDefinitions.Four | FlagDefinitions.Two, Value);
6265
}
6366

6467
[ExpectedException(typeof(JsonException))]

0 commit comments

Comments
 (0)