Skip to content

Commit 0c374e3

Browse files
Update StrEnum to v2.0.0 and use the new TryParse method to match members by value. (#3)
1 parent ca3fbce commit 0c374e3

5 files changed

Lines changed: 29 additions & 13 deletions

File tree

README.md

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -51,13 +51,16 @@ The above produces:
5151

5252
### Deserialize from JSON:
5353

54-
```csharp
55-
var race = JsonSerializer.Deserialize<Race>(json, options);
54+
```json
55+
{"Name":"Cape Town Cycle Tour","Sport":"ROAD_CYCLING"}
5656
```
5757

58-
`race` is equivalent to:
58+
The above JSON can be deserialized into a C# object that contains a StrEnum enum:
5959

6060
```csharp
61+
var race = JsonSerializer.Deserialize<Race>(json, options);
62+
63+
// race is equivalent to:
6164
new { Name = "Cape Town Cycle Tour", Sport = Sport.RoadCycling };
6265
```
6366

src/StrEnum.System.Text.Json/Converters/StringEnumJsonConverter.cs

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -19,17 +19,17 @@ public override TStringEnum Read(ref Utf8JsonReader reader, Type typeToConvert,
1919
{
2020
var jsonValue = reader.GetString();
2121

22-
StringEnum<TStringEnum>.TryParse(reader.GetString()!, out var parsed);
22+
var parsed = StringEnum<TStringEnum>.TryParse(reader.GetString()!, out var member, matchBy:MatchBy.ValueOnly);
2323

24-
if (parsed == null || !((string)parsed).Equals(jsonValue, StringComparison.InvariantCulture))
24+
if (!parsed)
2525
{
2626
if (_noMemberFoundBehavior == NoMemberFoundBehavior.ReturnNull)
2727
return null!;
2828

29-
throw new JsonException($"Requested name or value '{jsonValue}' was not found in the string enum '{typeof(TStringEnum).Name}'.");
29+
throw new JsonException($"Requested value '{jsonValue}' was not found in the string enum '{typeof(TStringEnum).Name}'.");
3030
}
3131

32-
return parsed;
32+
return member!;
3333
}
3434

3535
public override void Write(Utf8JsonWriter writer, TStringEnum value, JsonSerializerOptions options)

src/StrEnum.System.Text.Json/StrEnum.System.Text.Json.csproj

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
<Project Sdk="Microsoft.NET.Sdk">
1+
<Project Sdk="Microsoft.NET.Sdk">
22

33
<PropertyGroup>
44
<PackageId>StrEnum.System.Text.Json</PackageId>
@@ -19,7 +19,7 @@
1919

2020
<ItemGroup>
2121
<PackageReference Include="System.Text.Json" Version="[4.6.0,7.0.0)" />
22-
<PackageReference Include="StrEnum" Version="[1.4.0,2.0.0)" />
22+
<PackageReference Include="StrEnum" Version="[2.0.0,3.0.0)" />
2323
</ItemGroup>
2424

2525
<ItemGroup>

test/StrEnum.System.Text.Json.IntegrationTests/DeserializeTests.cs

Lines changed: 16 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -41,7 +41,7 @@ public void Deserialize_GivenJsonWithEnumsName_AndDefaultNoMemberBehavior_Should
4141
var deserialize = () => JsonSerializer.Deserialize<DeserializedObject>(json, options);
4242

4343
deserialize.Should().Throw<JsonException>()
44-
.WithMessage("Requested name or value 'TrailRunning' was not found in the string enum 'Sport'.");
44+
.WithMessage("Requested value 'TrailRunning' was not found in the string enum 'Sport'.");
4545
}
4646

4747
[Fact]
@@ -68,11 +68,11 @@ public void Deserialize_GivenJsonWithInvalidValue_AndDefaultNoMemberBehavior_Sho
6868
var deserialize = () => JsonSerializer.Deserialize<DeserializedObject>(json, options);
6969

7070
deserialize.Should().Throw<JsonException>()
71-
.WithMessage("Requested name or value 'Quidditch' was not found in the string enum 'Sport'.");
71+
.WithMessage("Requested value 'Quidditch' was not found in the string enum 'Sport'.");
7272
}
7373

7474
[Fact]
75-
public void Deserialize_GivenJsonWithInvalidValue_AndReturnNullNoMemberBehavior_ShouldThrowAnException()
75+
public void Deserialize_GivenJsonWithInvalidValue_AndReturnNullNoMemberBehavior_ShouldReturnNull()
7676
{
7777
var json = @"{""sport"":""Quidditch""}";
7878

@@ -83,5 +83,18 @@ public void Deserialize_GivenJsonWithInvalidValue_AndReturnNullNoMemberBehavior_
8383

8484
obj.Should().BeEquivalentTo(new { Sport = (Sport?)null });
8585
}
86+
87+
[Fact]
88+
public void Deserialize_GivenJsonWithValidName_AndReturnNullNoMemberBehavior_ShouldReturnNull()
89+
{
90+
var json = @"{""sport"":""TrailRunning""}";
91+
92+
var options = new JsonSerializerOptions { PropertyNamingPolicy = JsonNamingPolicy.CamelCase }
93+
.UseStringEnums(NoMemberFoundBehavior.ReturnNull);
94+
95+
var obj = JsonSerializer.Deserialize<DeserializedObject>(json, options);
96+
97+
obj.Should().BeEquivalentTo(new { Sport = (Sport?)null });
98+
}
8699
}
87100
}

test/StrEnum.System.Text.Json.IntegrationTests/StrEnum.System.Text.Json.IntegrationTests.csproj

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@
1010
<ItemGroup>
1111
<PackageReference Include="FluentAssertions" Version="6.6.0" />
1212
<PackageReference Include="Microsoft.NET.Test.Sdk" Version="16.11.0" />
13-
<PackageReference Include="StrEnum" Version="1.4.0" />
13+
<PackageReference Include="StrEnum" Version="2.0.0" />
1414
<PackageReference Include="System.Text.Json" Version="6.0.4" />
1515
<PackageReference Include="xunit" Version="2.4.1" />
1616
<PackageReference Include="xunit.runner.visualstudio" Version="2.4.3">

0 commit comments

Comments
 (0)