40 lines
2.1 KiB
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("未知的消息类型");
|
|
};
|
|
}
|
|
}
|