1
0
mirror of synced 2026-05-22 14:43:15 +00:00

refactor: 重构 JSON 转换器模块

This commit is contained in:
click33
2025-02-20 18:38:22 +08:00
parent ede9aba865
commit e6dd850752
8 changed files with 190 additions and 24 deletions
@@ -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);
}
}
@@ -32,6 +32,9 @@ public interface SaSpringBootErrorCode {
/** JSON 字符串转 Map 失败 */
int CODE_20104 = 20104;
/** JSON 字符串转 Object 失败 */
int CODE_20106 = 20106;
/** 默认的 Filter 异常处理函数 */
int CODE_20105 = 20105;
@@ -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);