json转换优化 (#79)

* 🐛 修复 json中有需要转义的字符时报错
* 🐛 误传入其他框架的 typeReference 进行json转换时报错
This commit is contained in:
b2baccline
2021-04-01 15:33:20 +08:00
parent 94721485cf
commit ae34de29ed
3 changed files with 48 additions and 6 deletions

View File

@@ -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);

View File

@@ -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);
}

View File

@@ -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);
}
}