package com.example.catchTheLetters.utils; import com.example.catchTheLetters.entity.*; import com.example.catchTheLetters.enums.MessageType; import com.fasterxml.jackson.core.JacksonException; import com.fasterxml.jackson.core.JsonParser; import com.fasterxml.jackson.databind.DeserializationContext; import com.fasterxml.jackson.databind.JsonDeserializer; import com.fasterxml.jackson.databind.JsonNode; import com.fasterxml.jackson.databind.ObjectMapper; import java.io.IOException; /** * 游戏消息反序列化 * * @author spyn */ public class GameMessageDeserializer extends JsonDeserializer> { private final ObjectMapper objectMapper = new ObjectMapper(); @Override public GameMessage deserialize(JsonParser jsonParser, DeserializationContext deserializationContext) throws IOException, JacksonException { var node = jsonParser.getCodec().readTree(jsonParser); var type = objectMapper.convertValue(node.get("type"), JsonNode.class); var data = objectMapper.convertValue(node.get("data"), JsonNode.class); return switch (type.asText()) { case "INPUT" -> new GameMessage<>(MessageType.INPUT, objectMapper.treeToValue(data, PlayerInput.class)); case "ROOM" -> new GameMessage<>(MessageType.ROOM, objectMapper.treeToValue(data, RoomAction.class)); case "LETTER" -> new GameMessage<>(MessageType.LETTER, objectMapper.treeToValue(data, LetterAction.class)); case "SCORE" -> new GameMessage<>(MessageType.SCORE, objectMapper.treeToValue(data, ScoreAction.class)); case "HEALTH" -> new GameMessage<>(MessageType.HEALTH, objectMapper.treeToValue(data, HealthAction.class)); default -> throw new IllegalArgumentException("未知的消息类型"); }; } }