diff --git a/src/Protobuf.System.Text.Json/InternalConverters/FieldConverter.cs b/src/Protobuf.System.Text.Json/InternalConverters/FieldConverter.cs index 2264106..10d2a98 100644 --- a/src/Protobuf.System.Text.Json/InternalConverters/FieldConverter.cs +++ b/src/Protobuf.System.Text.Json/InternalConverters/FieldConverter.cs @@ -19,6 +19,11 @@ public override void Read(ref Utf8JsonReader reader, IMessage obj, Type typeToCo IFieldAccessor fieldAccessor) { _converter ??= GetConverter(ref options); + if (reader.TokenType == JsonTokenType.Null && !_converter.HandleNull) + { + return; + } + var read = _converter.Read(ref reader, typeToConvert, options); if (read is { } value) { diff --git a/test/Protobuf.System.Text.Json.Tests/SimpleMessageTests.cs b/test/Protobuf.System.Text.Json.Tests/SimpleMessageTests.cs index 6490fa6..563333d 100644 --- a/test/Protobuf.System.Text.Json.Tests/SimpleMessageTests.cs +++ b/test/Protobuf.System.Text.Json.Tests/SimpleMessageTests.cs @@ -74,4 +74,48 @@ public void Should_deserialize_message_with_primitive_types() Assert.Equal(msg.Int32Property, deserialized.Int32Property); Assert.Equal(msg.Int64Property, deserialized.Int64Property); } + + [Fact] + public void Should_deserialize_message_with_primitive_types_when_values_were_explicitly_set_to_nulls() + { + // Arrange + var serialized = + """ + { + "doubleProperty" : null, + "floatProperty" : null, + "int32Property" : null, + "int64Property" : null, + "uint32Property" : null, + "uint64Property" : null, + "sint32Property" : null, + "sint64Property" : null, + "fixed32Property" : null, + "fixed64Property" : null, + "sfixed32Property" : null, + "sfixed64Property" : null, + "boolProperty" : null + } + """; + var jsonSerializerOptions = TestHelper.CreateJsonSerializerOptions(); + + // Act + var deserialized = JsonSerializer.Deserialize(serialized, jsonSerializerOptions); + + // Assert + Assert.NotNull(deserialized); + Assert.Equal(0d, deserialized.DoubleProperty); + Assert.Equal(0f, deserialized.FloatProperty); + Assert.Equal(0, deserialized.Int32Property); + Assert.Equal(0L, deserialized.Int64Property); + Assert.Equal(0u, deserialized.Uint32Property); + Assert.Equal(0ul, deserialized.Uint64Property); + Assert.Equal(0, deserialized.Sint32Property); + Assert.Equal(0L, deserialized.Sint64Property); + Assert.Equal(0u, deserialized.Fixed32Property); + Assert.Equal(0ul, deserialized.Fixed64Property); + Assert.Equal(0, deserialized.Sfixed32Property); + Assert.Equal(0L, deserialized.Sfixed64Property); + Assert.False(deserialized.BoolProperty); + } } \ No newline at end of file