CatchTheLettersBackend/src/main/java/com/example/catchTheLetters/utils/GameMessageDeserializer.java

40 lines
2.1 KiB
Java

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<GameMessage<?>> {
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));
case "ERROR" -> new GameMessage<>(MessageType.ERROR, objectMapper.treeToValue(data, String.class));
case "LOGIN" -> new GameMessage<>(MessageType.LOGIN, objectMapper.treeToValue(data, String.class));
case "LOGOUT" -> new GameMessage<>(MessageType.LOGOUT, objectMapper.treeToValue(data, String.class));
default -> throw new IllegalArgumentException("未知的消息类型");
};
}
}