refactor: 重构 JSON 转换器模块
This commit is contained in:
+29
-4
@@ -25,13 +25,38 @@ import java.util.Map;
|
||||
* @since 2.0
|
||||
*/
|
||||
public class SaJsonTemplateForSnack3 implements SaJsonTemplate {
|
||||
|
||||
/**
|
||||
* 序列化:对象 -> json 字符串
|
||||
*
|
||||
* @param obj /
|
||||
* @return /
|
||||
*/
|
||||
@Override
|
||||
public String toJsonString(Object o) {
|
||||
return ONode.stringify(o);
|
||||
public String objectToJson(Object obj) {
|
||||
return ONode.stringify(obj);
|
||||
}
|
||||
|
||||
/**
|
||||
* 反序列化:json 字符串 → 对象
|
||||
*
|
||||
* @param jsonStr /
|
||||
* @return /
|
||||
*/
|
||||
@Override
|
||||
public Map<String, Object> parseJsonToMap(String s) {
|
||||
return ONode.deserialize(s, Map.class);
|
||||
public Object jsonToObject(String jsonStr) {
|
||||
return ONode.deserialize(jsonStr);
|
||||
}
|
||||
|
||||
/**
|
||||
* 反序列化:json 字符串 → Map
|
||||
*
|
||||
* @param jsonStr /
|
||||
* @return /
|
||||
*/
|
||||
@Override
|
||||
public Map<String, Object> jsonToMap(String jsonStr) {
|
||||
return ONode.deserialize(jsonStr, Map.class);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
+3
@@ -32,6 +32,9 @@ public interface SaSpringBootErrorCode {
|
||||
/** JSON 字符串转 Map 失败 */
|
||||
int CODE_20104 = 20104;
|
||||
|
||||
/** JSON 字符串转 Object 失败 */
|
||||
int CODE_20106 = 20106;
|
||||
|
||||
/** 默认的 Filter 异常处理函数 */
|
||||
int CODE_20105 = 20105;
|
||||
|
||||
|
||||
+46
-5
@@ -18,8 +18,12 @@ package cn.dev33.satoken.spring.json;
|
||||
import cn.dev33.satoken.error.SaSpringBootErrorCode;
|
||||
import cn.dev33.satoken.exception.SaJsonConvertException;
|
||||
import cn.dev33.satoken.json.SaJsonTemplate;
|
||||
import com.fasterxml.jackson.annotation.JsonTypeInfo;
|
||||
import com.fasterxml.jackson.core.JsonProcessingException;
|
||||
import com.fasterxml.jackson.databind.ObjectMapper;
|
||||
import com.fasterxml.jackson.databind.SerializationFeature;
|
||||
import com.fasterxml.jackson.databind.jsontype.BasicPolymorphicTypeValidator;
|
||||
import com.fasterxml.jackson.databind.jsontype.PolymorphicTypeValidator;
|
||||
|
||||
import java.util.Map;
|
||||
|
||||
@@ -36,23 +40,60 @@ public class SaJsonTemplateForJackson implements SaJsonTemplate {
|
||||
*/
|
||||
public ObjectMapper objectMapper = new ObjectMapper();
|
||||
|
||||
public SaJsonTemplateForJackson() {
|
||||
|
||||
// 1、使 objectMapper 序列化时带上类型信息,以便该 json 字符串可以成功反序列化
|
||||
// 构建反序列化限制器,此处可以限制只允许指定类型或指定包下的类型才可以反序列化,此处指定所有类型都可以反序列化
|
||||
PolymorphicTypeValidator ptv = BasicPolymorphicTypeValidator.builder()
|
||||
// 允许所有子类型反序列化(即反序列化时遇到的类)
|
||||
.allowIfSubType(Object.class)
|
||||
// 允许所有基类型反序列化(如 Object、自定义抽象类)
|
||||
.allowIfBaseType(Object.class)
|
||||
.build();
|
||||
// 启用全局默认类型(嵌入类型信息)
|
||||
objectMapper.activateDefaultTyping(
|
||||
ptv,
|
||||
// 对非 final 类嵌入类型信息
|
||||
ObjectMapper.DefaultTyping.NON_FINAL,
|
||||
// 类型信息以属性形式存在("@class")
|
||||
JsonTypeInfo.As.PROPERTY
|
||||
);
|
||||
|
||||
// 2、使空 bean 在序列化时也能记录类型信息,而不是只序列化成 {}
|
||||
objectMapper.configure(SerializationFeature.FAIL_ON_EMPTY_BEANS, false);
|
||||
|
||||
}
|
||||
|
||||
/**
|
||||
* 将任意对象转换为 json 字符串
|
||||
* 序列化:对象 -> json 字符串
|
||||
*/
|
||||
@Override
|
||||
public String toJsonString(Object obj) {
|
||||
public String objectToJson(Object obj) {
|
||||
try {
|
||||
return objectMapper.writeValueAsString(obj);
|
||||
} catch (JsonProcessingException e) {
|
||||
throw new SaJsonConvertException(e).setCode(SaSpringBootErrorCode.CODE_20103);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* 将 json 字符串解析为 Map
|
||||
* 反序列化:json 字符串 → 对象
|
||||
*/
|
||||
@Override
|
||||
public Map<String, Object> parseJsonToMap(String jsonStr) {
|
||||
public Object jsonToObject(String jsonStr) {
|
||||
try {
|
||||
Object value = objectMapper.readValue(jsonStr, Object.class);
|
||||
return value;
|
||||
} catch (JsonProcessingException e) {
|
||||
throw new SaJsonConvertException(e).setCode(SaSpringBootErrorCode.CODE_20106);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* 反序列化:json 字符串 → Map
|
||||
*/
|
||||
@Override
|
||||
public Map<String, Object> jsonToMap(String jsonStr) {
|
||||
try {
|
||||
@SuppressWarnings("unchecked")
|
||||
Map<String, Object> map = objectMapper.readValue(jsonStr, Map.class);
|
||||
|
||||
Reference in New Issue
Block a user