Skip to content

Commit 3abb1cd

Browse files
authored
Fix deserialization of nullable string IDs (#94)
* Fix deserialization of nullable stringIDs * Fix snapshots
1 parent 26037e2 commit 3abb1cd

File tree

5 files changed

+58
-0
lines changed

5 files changed

+58
-0
lines changed

src/StronglyTypedIds/Templates/String/String_NewtonsoftJsonConverter.cs

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,13 @@ public override void WriteJson(Newtonsoft.Json.JsonWriter writer, object value,
1414

1515
public override object ReadJson(Newtonsoft.Json.JsonReader reader, System.Type objectType, object existingValue, Newtonsoft.Json.JsonSerializer serializer)
1616
{
17+
if (objectType == typeof(TESTID?))
18+
{
19+
var value = serializer.Deserialize<string?>(reader);
20+
21+
return value is null ? null : new TESTID(value);
22+
}
23+
1724
return new TESTID(serializer.Deserialize<string>(reader));
1825
}
1926
}

test/StronglyTypedIds.IntegrationTests/NullableStringIdTests.cs

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -75,6 +75,20 @@ public void CanSerializeToString_WithNewtonsoftJsonProvider()
7575
Assert.Equal(serializedFoo, serializedString);
7676
}
7777

78+
[Fact]
79+
public void CanSerializeToNullableId_WithNewtonsoftJsonProvider()
80+
{
81+
var entity = new EntityWithNullableId { Id = null };
82+
83+
var json = NewtonsoftJsonSerializer.SerializeObject(entity);
84+
var deserialize = NewtonsoftJsonSerializer.DeserializeObject<EntityWithNullableId>(json);
85+
86+
Assert.NotNull(deserialize);
87+
// Note the different behaviour from String ID - this will _always_ deserialize to an ID
88+
Assert.NotNull(deserialize.Id);
89+
Assert.Null(deserialize.Id.Value.Value);
90+
}
91+
7892
[Fact]
7993
public void CanSerializeToString_WithSystemTextJsonProvider()
8094
{
@@ -407,5 +421,11 @@ public class TestEntity
407421
public Guid Id { get; set; }
408422
public EfCoreNullableStringId Name { get; set; }
409423
}
424+
425+
426+
public class EntityWithNullableId
427+
{
428+
public NewtonsoftJsonNullableStringId? Id { get; set; }
429+
}
410430
}
411431
}

test/StronglyTypedIds.IntegrationTests/StringIdTests.cs

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -81,6 +81,18 @@ public void CanSerializeToString_WithNewtonsoftJsonProvider()
8181
Assert.Equal(serializedFoo, serializedString);
8282
}
8383

84+
[Fact]
85+
public void CanSerializeToNullableId_WithNewtonsoftJsonProvider()
86+
{
87+
var entity = new EntityWithNullableId { Id = null };
88+
89+
var json = NewtonsoftJsonSerializer.SerializeObject(entity);
90+
var deserialize = NewtonsoftJsonSerializer.DeserializeObject<EntityWithNullableId>(json);
91+
92+
Assert.NotNull(deserialize);
93+
Assert.Null(deserialize.Id);
94+
}
95+
8496
[Fact]
8597
public void CanSerializeToString_WithSystemTextJsonProvider()
8698
{
@@ -343,5 +355,10 @@ public class TestEntity
343355
public Guid Id { get; set; }
344356
public EfCoreStringId Name { get; set; }
345357
}
358+
359+
public class EntityWithNullableId
360+
{
361+
public NewtonsoftJsonStringId? Id { get; set; }
362+
}
346363
}
347364
}

test/StronglyTypedIds.Tests/Snapshots/SourceGenerationHelperSnapshotTests.GeneratesFullIdCorrectly_type=String.verified.txt

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -135,6 +135,13 @@
135135

136136
public override object ReadJson(Newtonsoft.Json.JsonReader reader, System.Type objectType, object existingValue, Newtonsoft.Json.JsonSerializer serializer)
137137
{
138+
if (objectType == typeof(MyTestId?))
139+
{
140+
var value = serializer.Deserialize<string?>(reader);
141+
142+
return value is null ? null : new MyTestId(value);
143+
}
144+
138145
return new MyTestId(serializer.Deserialize<string>(reader));
139146
}
140147
}

test/StronglyTypedIds.Tests/Snapshots/SourceGenerationHelperSnapshotTests.GeneratesIdCorrectly_type=String_c=NewtonsoftJson_i=None.verified.txt

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -58,6 +58,13 @@
5858

5959
public override object ReadJson(Newtonsoft.Json.JsonReader reader, System.Type objectType, object existingValue, Newtonsoft.Json.JsonSerializer serializer)
6060
{
61+
if (objectType == typeof(MyTestId?))
62+
{
63+
var value = serializer.Deserialize<string?>(reader);
64+
65+
return value is null ? null : new MyTestId(value);
66+
}
67+
6168
return new MyTestId(serializer.Deserialize<string>(reader));
6269
}
6370
}

0 commit comments

Comments
 (0)