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

View File

@ -26,18 +26,27 @@ import java.util.Map;
public interface SaJsonTemplate {
/**
* 将任意对象序列化为 json 字符串
* 序列化对象 -> json 字符串
*
* @param obj 对象
* @return 转换后的 json 字符串
* @param obj /
* @return /
*/
String toJsonString(Object obj);
String objectToJson(Object obj);
/**
* 解析 json 字符串为 map 对象
* @param jsonStr json 字符串
* @return map 对象
* 反序列化json 字符串 对象
*
* @param jsonStr /
* @return /
*/
Map<String, Object> parseJsonToMap(String jsonStr);
Object jsonToObject(String jsonStr);
/**
* 反序列化json 字符串 Map
*
* @param jsonStr /
* @return /
*/
Map<String, Object> jsonToMap(String jsonStr);
}

View File

@ -15,11 +15,11 @@
*/
package cn.dev33.satoken.json;
import java.util.Map;
import cn.dev33.satoken.error.SaErrorCode;
import cn.dev33.satoken.exception.NotImplException;
import java.util.Map;
/**
* JSON 转换器默认实现类
*
@ -33,12 +33,17 @@ public class SaJsonTemplateDefaultImpl implements SaJsonTemplate {
public static final String ERROR_MESSAGE = "未实现具体的 json 转换器";
@Override
public String toJsonString(Object obj) {
public String objectToJson(Object obj) {
throw new NotImplException(ERROR_MESSAGE).setCode(SaErrorCode.CODE_10003);
}
@Override
public Map<String, Object> parseJsonToMap(String jsonStr) {
public Object jsonToObject(String jsonStr) {
throw new NotImplException(ERROR_MESSAGE).setCode(SaErrorCode.CODE_10003);
}
@Override
public Map<String, Object> jsonToMap(String jsonStr) {
throw new NotImplException(ERROR_MESSAGE).setCode(SaErrorCode.CODE_10003);
}

View File

@ -159,7 +159,7 @@ public class SaResult extends LinkedHashMap<String, Object> implements Serializa
* @return 对象自身
*/
public SaResult setJsonString(String jsonString) {
Map<String, Object> map = SaManager.getSaJsonTemplate().parseJsonToMap(jsonString);
Map<String, Object> map = SaManager.getSaJsonTemplate().jsonToMap(jsonString);
return setMap(map);
}

View File

@ -0,0 +1,64 @@
package com.pj.model;
/**
* Role 实体类
*
* @author click33
* @since 2022-10-15
*/
public class SysRole {
//
// public SysRole() {
// }
//
// public SysRole(long id, String name) {
// super();
// this.id = id;
// this.name = name;
// }
//
//
// /**
// * 角色id
// */
// private long id;
//
// /**
// * 角色名称
// */
// private String name;
//
// /**
// * @return id
// */
// public long getId() {
// return id;
// }
//
// /**
// * @param id 要设置的 id
// */
// public void setId(long id) {
// this.id = id;
// }
//
// /**
// * @return name
// */
// public String getName() {
// return name;
// }
//
// /**
// * @param name 要设置的 name
// */
// public void setName(String name) {
// this.name = name;
// }
//
// @Override
// public String toString() {
// return "SysRole [id=" + id + ", name=" + name + "]";
// }
//
}

View File

@ -34,6 +34,11 @@ public class SysUser {
*/
private int age;
/**
* 用户角色
*/
private SysRole role;
/**
* @return id
*/
@ -76,9 +81,23 @@ public class SysUser {
this.age = age;
}
public SysRole getRole() {
return role;
}
public SysUser setRole(SysRole role) {
this.role = role;
return this;
}
@Override
public String toString() {
return "SysUser [id=" + id + ", name=" + name + ", age=" + age + "]";
return "SysUser{" +
"id=" + id +
", name='" + name + '\'' +
", age=" + age +
", role=" + role +
'}';
}
}

View File

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

View File

@ -32,6 +32,9 @@ public interface SaSpringBootErrorCode {
/** JSON 字符串转 Map 失败 */
int CODE_20104 = 20104;
/** JSON 字符串转 Object 失败 */
int CODE_20106 = 20106;
/** 默认的 Filter 异常处理函数 */
int CODE_20105 = 20105;

View File

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