Skip to content

Commit 1302a05

Browse files
committed
Handle null values during deserialization of primitive types
1 parent 67438ab commit 1302a05

2 files changed

Lines changed: 49 additions & 0 deletions

File tree

src/Protobuf.System.Text.Json/InternalConverters/FieldConverter.cs

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,11 @@ public override void Read(ref Utf8JsonReader reader, IMessage obj, Type typeToCo
1919
IFieldAccessor fieldAccessor)
2020
{
2121
_converter ??= GetConverter(ref options);
22+
if (reader.TokenType == JsonTokenType.Null && !_converter.HandleNull)
23+
{
24+
return;
25+
}
26+
2227
var read = _converter.Read(ref reader, typeToConvert, options);
2328
if (read is { } value)
2429
{

test/Protobuf.System.Text.Json.Tests/SimpleMessageTests.cs

Lines changed: 44 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -74,4 +74,48 @@ public void Should_deserialize_message_with_primitive_types()
7474
Assert.Equal(msg.Int32Property, deserialized.Int32Property);
7575
Assert.Equal(msg.Int64Property, deserialized.Int64Property);
7676
}
77+
78+
[Fact]
79+
public void Should_deserialize_message_with_primitive_types_when_values_were_explicitly_set_to_nulls()
80+
{
81+
// Arrange
82+
var serialized =
83+
"""
84+
{
85+
"doubleProperty" : null,
86+
"floatProperty" : null,
87+
"int32Property" : null,
88+
"int64Property" : null,
89+
"uint32Property" : null,
90+
"uint64Property" : null,
91+
"sint32Property" : null,
92+
"sint64Property" : null,
93+
"fixed32Property" : null,
94+
"fixed64Property" : null,
95+
"sfixed32Property" : null,
96+
"sfixed64Property" : null,
97+
"boolProperty" : null
98+
}
99+
""";
100+
var jsonSerializerOptions = TestHelper.CreateJsonSerializerOptions();
101+
102+
// Act
103+
var deserialized = JsonSerializer.Deserialize<SimpleMessage>(serialized, jsonSerializerOptions);
104+
105+
// Assert
106+
Assert.NotNull(deserialized);
107+
Assert.Equal(0d, deserialized.DoubleProperty);
108+
Assert.Equal(0f, deserialized.FloatProperty);
109+
Assert.Equal(0, deserialized.Int32Property);
110+
Assert.Equal(0L, deserialized.Int64Property);
111+
Assert.Equal(0u, deserialized.Uint32Property);
112+
Assert.Equal(0ul, deserialized.Uint64Property);
113+
Assert.Equal(0, deserialized.Sint32Property);
114+
Assert.Equal(0L, deserialized.Sint64Property);
115+
Assert.Equal(0u, deserialized.Fixed32Property);
116+
Assert.Equal(0ul, deserialized.Fixed64Property);
117+
Assert.Equal(0, deserialized.Sfixed32Property);
118+
Assert.Equal(0L, deserialized.Sfixed64Property);
119+
Assert.False(deserialized.BoolProperty);
120+
}
77121
}

0 commit comments

Comments
 (0)