У меня есть функция, которая получает несколько разных строковых объектов json с разными именами структур и/или полей, например:
event = '{"userId": "TDQIQb2fQaORKvCyepDYoZgsoEE3", "profileIsCreated": true}'
or
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. - person deceze♦   schedule 16.01.2020event
в функциюcast_event
я должен добавить тип события в качестве поля в полезной нагрузке, как вы показали? а фактическое событие будет вdata
? Итак, я думаю, мне нужно найтиdict
или что-то еще, чтобы использовать правильный класс данных? - person billydh   schedule 16.01.2020