diff --git a/src/dataclass.rs b/src/dataclass.rs index 282ba2dc0edafdc6da438a644f3b31da020ad334_c3JjL2RhdGFjbGFzcy5ycw==..a9eff9f72d1e62ae90f6510c38eff135fdd64790_c3JjL2RhdGFjbGFzcy5ycw== 100644 --- a/src/dataclass.rs +++ b/src/dataclass.rs @@ -46,6 +46,9 @@ let fields = ffi!(PyObject_GetAttr(self.ptr, DATACLASS_FIELDS_STR)); ffi!(Py_DECREF(fields)); let len = unsafe { PyDict_GET_SIZE(fields) as usize }; + if unlikely!(len == 0) { + return serializer.serialize_map(Some(0)).unwrap().end(); + } let mut map = serializer.serialize_map(None).unwrap(); let mut pos = 0isize; let mut str_size: pyo3::ffi::Py_ssize_t = 0; diff --git a/src/encode.rs b/src/encode.rs index 282ba2dc0edafdc6da438a644f3b31da020ad334_c3JjL2VuY29kZS5ycw==..a9eff9f72d1e62ae90f6510c38eff135fdd64790_c3JjL2VuY29kZS5ycw== 100644 --- a/src/encode.rs +++ b/src/encode.rs @@ -366,6 +366,9 @@ if !dict.is_null() { ffi!(Py_DECREF(dict)); let len = unsafe { PyDict_GET_SIZE(dict) as usize }; + if unlikely!(len == 0) { + return serializer.serialize_map(Some(0)).unwrap().end(); + } let mut map = serializer.serialize_map(None).unwrap(); let mut pos = 0isize; let mut str_size: pyo3::ffi::Py_ssize_t = 0; diff --git a/test/test_dataclass.py b/test/test_dataclass.py index 282ba2dc0edafdc6da438a644f3b31da020ad334_dGVzdC90ZXN0X2RhdGFjbGFzcy5weQ==..a9eff9f72d1e62ae90f6510c38eff135fdd64790_dGVzdC90ZXN0X2RhdGFjbGFzcy5weQ== 100644 --- a/test/test_dataclass.py +++ b/test/test_dataclass.py @@ -15,6 +15,18 @@ @dataclass +class EmptyDataclass: + pass + + +@dataclass +class EmptyDataclassSlots: + __slots__ = () + pass + + + +@dataclass class Dataclass1: name: str number: int @@ -115,6 +127,22 @@ with self.assertRaises(orjson.JSONEncodeError): orjson.dumps(obj1) + def test_dataclass_empty(self): + """ + dumps() no attributes + """ + self.assertEqual( + orjson.dumps(EmptyDataclass()), b"{}", + ) + + def test_dataclass_empty_slots(self): + """ + dumps() no attributes slots + """ + self.assertEqual( + orjson.dumps(EmptyDataclassSlots()), b"{}", + ) + def test_dataclass_default_arg(self): """ dumps() dataclass default arg