json转换优化 (#79)
* 🐛 修复 json中有需要转义的字符时报错 * 🐛 误传入其他框架的 typeReference 进行json转换时报错
This commit is contained in:
@@ -1,5 +1,7 @@
|
||||
package com.hccake.ballcat.common.conf.config;
|
||||
|
||||
import com.fasterxml.jackson.core.JsonParser;
|
||||
import com.fasterxml.jackson.core.json.JsonReadFeature;
|
||||
import com.fasterxml.jackson.databind.DeserializationFeature;
|
||||
import com.fasterxml.jackson.databind.ObjectMapper;
|
||||
import com.hccake.ballcat.common.core.jackson.JavaTimeModule;
|
||||
@@ -37,6 +39,8 @@ public class JacksonConfig {
|
||||
objectMapper.getSerializerFactory().withSerializerModifier(new NullSerializerModifier()));
|
||||
// 时间解析器
|
||||
objectMapper.registerModule(new JavaTimeModule());
|
||||
// 有特殊需要转义字符, 不报错
|
||||
objectMapper.enable(JsonReadFeature.ALLOW_UNESCAPED_CONTROL_CHARS.mappedFeature());
|
||||
|
||||
// 更新 JsonUtils 中的 ObjectMapper,保持容器和工具类中的 ObjectMapper 对象一致
|
||||
JacksonJsonToolAdapter.setMapper(objectMapper);
|
||||
|
||||
@@ -1,11 +1,15 @@
|
||||
package com.hccake.ballcat.common.util;
|
||||
|
||||
import com.hccake.ballcat.common.util.json.*;
|
||||
import com.hccake.ballcat.common.util.json.FastjsonJsonToolAdapter;
|
||||
import com.hccake.ballcat.common.util.json.GsonJsonToolAdapter;
|
||||
import com.hccake.ballcat.common.util.json.HuToolJsonToolAdapter;
|
||||
import com.hccake.ballcat.common.util.json.JacksonJsonToolAdapter;
|
||||
import com.hccake.ballcat.common.util.json.JsonTool;
|
||||
import com.hccake.ballcat.common.util.json.TypeReference;
|
||||
import java.lang.reflect.Type;
|
||||
import lombok.Getter;
|
||||
import lombok.SneakyThrows;
|
||||
|
||||
import java.lang.reflect.Type;
|
||||
|
||||
/**
|
||||
* @author lingting 2021/2/25 20:38
|
||||
*/
|
||||
@@ -54,6 +58,32 @@ public final class JsonUtils {
|
||||
|
||||
@SneakyThrows
|
||||
public static <T> T toObj(String json, Type t) {
|
||||
// 防止误传入其他类型的 typeReference 走这个方法然后转换出错
|
||||
if (t instanceof cn.hutool.core.lang.TypeReference) {
|
||||
return toObj(json, new TypeReference<T>() {
|
||||
@Override
|
||||
public Type getType() {
|
||||
return ((cn.hutool.core.lang.TypeReference<?>) t).getType();
|
||||
}
|
||||
});
|
||||
}
|
||||
else if (t instanceof com.alibaba.fastjson.TypeReference) {
|
||||
return toObj(json, new TypeReference<T>() {
|
||||
@Override
|
||||
public Type getType() {
|
||||
return ((com.alibaba.fastjson.TypeReference<?>) t).getType();
|
||||
}
|
||||
});
|
||||
}
|
||||
else if (t instanceof com.fasterxml.jackson.core.type.TypeReference) {
|
||||
return toObj(json, new TypeReference<T>() {
|
||||
@Override
|
||||
public Type getType() {
|
||||
return ((com.fasterxml.jackson.core.type.TypeReference<?>) t).getType();
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
return jsonTool.toObj(json, t);
|
||||
}
|
||||
|
||||
|
||||
@@ -1,6 +1,8 @@
|
||||
package com.hccake.ballcat.common.websocket.handler;
|
||||
|
||||
import com.fasterxml.jackson.core.JsonParser;
|
||||
import com.fasterxml.jackson.core.JsonProcessingException;
|
||||
import com.fasterxml.jackson.core.json.JsonReadFeature;
|
||||
import com.fasterxml.jackson.databind.JsonNode;
|
||||
import com.fasterxml.jackson.databind.ObjectMapper;
|
||||
import com.hccake.ballcat.common.websocket.holder.JsonMessageHandlerHolder;
|
||||
@@ -18,6 +20,13 @@ import org.springframework.web.socket.handler.TextWebSocketHandler;
|
||||
@Slf4j
|
||||
public class CustomWebSocketHandler extends TextWebSocketHandler {
|
||||
|
||||
private static final ObjectMapper MAPPER = new ObjectMapper();
|
||||
|
||||
static {
|
||||
// 有特殊需要转义字符, 不报错
|
||||
MAPPER.enable(JsonReadFeature.ALLOW_UNESCAPED_CONTROL_CHARS.mappedFeature());
|
||||
}
|
||||
|
||||
private PlanTextMessageHandler planTextMessageHandler;
|
||||
|
||||
public CustomWebSocketHandler() {
|
||||
@@ -35,9 +44,8 @@ public class CustomWebSocketHandler extends TextWebSocketHandler {
|
||||
}
|
||||
|
||||
// 消息类型必有一属性type,先解析,获取该属性
|
||||
ObjectMapper objectMapper = new ObjectMapper();
|
||||
String payload = message.getPayload();
|
||||
JsonNode jsonNode = objectMapper.readTree(payload);
|
||||
JsonNode jsonNode = MAPPER.readTree(payload);
|
||||
JsonNode typeNode = jsonNode.get(AbstractJsonWebSocketMessage.TYPE_FIELD);
|
||||
|
||||
if (typeNode == null) {
|
||||
@@ -58,7 +66,7 @@ public class CustomWebSocketHandler extends TextWebSocketHandler {
|
||||
}
|
||||
// 消息处理
|
||||
Class<? extends JsonWebSocketMessage> messageClass = jsonMessageHandler.getMessageClass();
|
||||
JsonWebSocketMessage websocketMessageJson = objectMapper.treeToValue(jsonNode, messageClass);
|
||||
JsonWebSocketMessage websocketMessageJson = MAPPER.treeToValue(jsonNode, messageClass);
|
||||
jsonMessageHandler.handle(session, websocketMessageJson);
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user