【发布时间】:2020-05-03 01:55:26
【问题描述】:
我有一个函数可以接收多个具有不同结构和/或字段名称的不同 json 字符串对象,如下所示:
event = '{"userId": "TDQIQb2fQaORKvCyepDYoZgsoEE3", "profileIsCreated": true}'
或
event = '{"userId": "TDQIQb2fQaORKvCyepDYoZgsoEE3", "signUpFinished": true}'
我有这样的数据类:
from dataclasses import dataclass, field
@dataclass_json(letter_case=LetterCase.CAMEL)
@dataclass(frozen=True)
class UserId:
userId: str
@dataclass_json(letter_case=LetterCase.CAMEL)
@dataclass(frozen=True)
class SignUpFinished(UserId):
signUpFinished: bool
@dataclass_json(letter_case=LetterCase.CAMEL)
@dataclass(frozen=True)
class UserProfileCreated(UserId):
profileIsCreated: bool
目前,我编写函数的方式是这样的:
def cast_event(event):
user_details = None
try:
user_details = SignUpFinished.from_json(event)
except KeyError:
pass
try:
user_details = UserProfileCreated.from_json(event)
except KeyError:
pass
if user_details:
return "OK"
else:
return "UNHANDLED"
问题是,随着我要处理的事件越来越多,我的函数会变得越来越长,然而,它只是做同样的事情。
有没有更好的方法来实现我想要实现的目标?
我已经检查了一些 SO 问题:
但它们似乎不是实现我想要的最佳方式。
【问题讨论】:
-
我建议尝试在这里进行更正式的区分,例如
{"event": "signupFinished", "data": {...}},这样您就可以轻松地打开event键来确定您正在处理的数据结构.暴力破解似乎是一种不好的方法,如果两个不同的数据类可能能够反序列化相同的 JSON,将会变得混乱。 -
我能确认你的意思吗?因此,当将
event发送到函数cast_event时,我应该像您展示的那样将事件类型添加为有效负载中的一个字段?实际事件将在data?所以,我想我会喜欢查找dict或使用正确数据类的东西? -
是的,完全正确。设置它,以便您可以将一个值映射到特定的数据类,而不是基本上需要将整个消息作为一个整体来确定它是什么数据类。
-
你能用一些工作代码发布答案吗?
标签: python json python-3.x try-except python-dataclasses