diff --git a/src/betterproto/__init__.py b/src/betterproto/__init__.py index 5e514d5..d546579 100644 --- a/src/betterproto/__init__.py +++ b/src/betterproto/__init__.py @@ -1180,8 +1180,8 @@ class Message(ABC): if value[key] is not None: if meta.proto_type == TYPE_MESSAGE: v = getattr(self, field_name) + cls = self._betterproto.cls_by_field[field_name] if isinstance(v, list): - cls = self._betterproto.cls_by_field[field_name] if cls == datetime: v = [isoparse(item) for item in value[key]] elif cls == timedelta: @@ -1191,16 +1191,15 @@ class Message(ABC): ] else: v = [cls().from_dict(item) for item in value[key]] - elif isinstance(v, datetime): + elif cls == datetime: v = isoparse(value[key]) setattr(self, field_name, v) - elif isinstance(v, timedelta): + elif cls == timedelta: v = timedelta(seconds=float(value[key][:-1])) setattr(self, field_name, v) elif meta.wraps: setattr(self, field_name, value[key]) elif v is None: - cls = self._betterproto.cls_by_field[field_name] setattr(self, field_name, cls().from_dict(value[key])) else: # NOTE: `from_dict` mutates the underlying message, so no diff --git a/tests/inputs/proto3_field_presence/proto3_field_presence.json b/tests/inputs/proto3_field_presence/proto3_field_presence.json index 3cc3ccb..988df8e 100644 --- a/tests/inputs/proto3_field_presence/proto3_field_presence.json +++ b/tests/inputs/proto3_field_presence/proto3_field_presence.json @@ -8,5 +8,6 @@ }, "test6": "B", "test7": "8589934592", - "test8": 2.5 + "test8": 2.5, + "test9": "2022-01-24T12:12:42Z" } diff --git a/tests/inputs/proto3_field_presence/proto3_field_presence.proto b/tests/inputs/proto3_field_presence/proto3_field_presence.proto index 0ccb700..d647843 100644 --- a/tests/inputs/proto3_field_presence/proto3_field_presence.proto +++ b/tests/inputs/proto3_field_presence/proto3_field_presence.proto @@ -1,5 +1,7 @@ syntax = "proto3"; +import "google/protobuf/timestamp.proto"; + message InnerTest { string test = 1; } @@ -13,6 +15,7 @@ message Test { optional TestEnum test6 = 6; optional uint64 test7 = 7; optional float test8 = 8; + optional google.protobuf.Timestamp test9 = 9; } enum TestEnum { diff --git a/tests/inputs/proto3_field_presence/test_proto3_field_presence.py b/tests/inputs/proto3_field_presence/test_proto3_field_presence.py index 364e0cc..e07b283 100644 --- a/tests/inputs/proto3_field_presence/test_proto3_field_presence.py +++ b/tests/inputs/proto3_field_presence/test_proto3_field_presence.py @@ -35,4 +35,5 @@ def test_null_fields_json(): "test6": None, "test7": None, "test8": None, + "test9": None, }