diff --git a/nonebot/utils.py b/nonebot/utils.py index e0900d12..688d0269 100644 --- a/nonebot/utils.py +++ b/nonebot/utils.py @@ -145,7 +145,7 @@ class DataclassEncoder(json.JSONEncoder): @overrides(json.JSONEncoder) def default(self, o): if dataclasses.is_dataclass(o): - return dataclasses.asdict(o) + return {f.name: getattr(o, f.name) for f in dataclasses.fields(o)} return super().default(o) diff --git a/tests/test_utils.py b/tests/test_utils.py new file mode 100644 index 00000000..d8936090 --- /dev/null +++ b/tests/test_utils.py @@ -0,0 +1,18 @@ +import json +from utils import make_fake_message + + +def test_dataclass_encoder(): + from nonebot.utils import DataclassEncoder + + MessageSegment = make_fake_message().get_segment_class() + ms = MessageSegment.node_custom( + "1234", "testtest", "test" + MessageSegment.image("url") + ) + s = json.dumps(ms, cls = DataclassEncoder) + assert ( + s + == '{"type": "node", "data": {"user_id": "1234", "nickname": "testtest", "content": [{"type": "text", "data": {"text": "test"}}, {"type": "image", "data": {"url": "url"}}]}}' + ) + s1 = json.dumps("123", cls = DataclassEncoder) + assert s1 == '"123"' \ No newline at end of file diff --git a/tests/utils.py b/tests/utils.py index 0cd94be4..e33ce5be 100644 --- a/tests/utils.py +++ b/tests/utils.py @@ -32,6 +32,16 @@ def make_fake_message(): def image(url: str): return FakeMessageSegment("image", {"url": url}) + @staticmethod + def node_custom( + user_id: str, + nickname: str, + content: Union["FakeMessage", "FakeMessageSegment", str], + ): + return FakeMessageSegment( + "node", {"user_id": user_id, "nickname": nickname, "content": content} + ) + def is_text(self) -> bool: return self.type == "text"