Skip to content

Commit 554567b

Browse files
authored
fix(number-enum-deserialization): added fixes for nullable enum deserialization with valid values (#53)
1 parent d7dd090 commit 554567b

File tree

2 files changed

+54
-4
lines changed

2 files changed

+54
-4
lines changed

APIMatic.Core.Test/Utilities/CoreHelperTest.cs

Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -151,6 +151,40 @@ public void JsonDeserialize_EmptyString()
151151
Assert.AreEqual(expected, actual);
152152
}
153153

154+
[Test]
155+
public void JsonDeserialize_EnumString()
156+
{
157+
var actualNullable = CoreHelper.JsonDeserialize<WorkingDays?>("\"Monday\"");
158+
Assert.AreEqual(WorkingDays.Monday, actualNullable);
159+
160+
var actual = CoreHelper.JsonDeserialize<WorkingDays>("\"Monday\"");
161+
Assert.AreEqual(WorkingDays.Monday, actual);
162+
}
163+
164+
[Test]
165+
public void JsonDeserialize_EnumStringNullable()
166+
{
167+
var actual = CoreHelper.JsonDeserialize<WorkingDays?>("null");
168+
Assert.AreEqual(null, actual);
169+
}
170+
171+
[Test]
172+
public void JsonDeserialize_EnumNumber()
173+
{
174+
var actualNullable = CoreHelper.JsonDeserialize<MonthNumber?>("3");
175+
Assert.AreEqual(MonthNumber.March, actualNullable);
176+
177+
var actual = CoreHelper.JsonDeserialize<MonthNumber>("3");
178+
Assert.AreEqual(MonthNumber.March, actual);
179+
}
180+
181+
[Test]
182+
public void JsonDeserialize_EnumNumberNullable()
183+
{
184+
var actual = CoreHelper.JsonDeserialize<MonthNumber?>("null");
185+
Assert.AreEqual(null, actual);
186+
}
187+
154188
#endregion
155189

156190
#region AppendQueryParameters

APIMatic.Core/Utilities/Converters/NumberEnumConverter.cs

Lines changed: 20 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -10,15 +10,31 @@ public override bool CanConvert(Type objectType)
1010
return objectType.BaseType.FullName == "System.Enum";
1111
}
1212

13+
private Type GetInnerType(Type type)
14+
{
15+
if (type.IsGenericType && type.GetGenericTypeDefinition() == typeof(Nullable<>))
16+
{
17+
return type.GenericTypeArguments[0];
18+
}
19+
20+
return type;
21+
}
22+
1323
public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer)
1424
{
15-
if (CanConvert(objectType) && reader.TokenType == JsonToken.Integer)
25+
if (reader.TokenType == JsonToken.Null)
26+
{
27+
return null;
28+
}
29+
30+
var innerType = GetInnerType(objectType);
31+
if (CanConvert(innerType) && reader.TokenType == JsonToken.Integer)
1632
{
17-
var value = Convert.ToInt32(reader.Value);
18-
return value;
33+
var enumValue = Enum.ToObject(innerType, Convert.ToInt32(reader.Value));
34+
return enumValue;
1935
}
2036

21-
throw new JsonSerializationException($"Invalid type for number enum.");
37+
throw new JsonSerializationException($"Invalid type for number enum {innerType.FullName}.");
2238
}
2339

2440
public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer)

0 commit comments

Comments
 (0)