From e9f44dd851a8f0bf18c00e3e5c53a8f8de9a6b66 Mon Sep 17 00:00:00 2001
From: Jerry Yan <792602257@qq.com>
Date: Fri, 25 Jul 2025 12:21:24 +0800
Subject: [PATCH 1/5] JacksonUtil
---
pom.xml | 14 +
.../com/ycwl/basic/utils/JacksonUtil.java | 277 ++++++++++++++++++
2 files changed, 291 insertions(+)
create mode 100644 src/main/java/com/ycwl/basic/utils/JacksonUtil.java
diff --git a/pom.xml b/pom.xml
index 641de13..c68ebd1 100644
--- a/pom.xml
+++ b/pom.xml
@@ -129,6 +129,20 @@
${fastjson.version}
+
+
+ com.fasterxml.jackson.core
+ jackson-databind
+
+
+ com.fasterxml.jackson.core
+ jackson-core
+
+
+ com.fasterxml.jackson.core
+ jackson-annotations
+
+
org.apache.commons
diff --git a/src/main/java/com/ycwl/basic/utils/JacksonUtil.java b/src/main/java/com/ycwl/basic/utils/JacksonUtil.java
new file mode 100644
index 0000000..4d0d65c
--- /dev/null
+++ b/src/main/java/com/ycwl/basic/utils/JacksonUtil.java
@@ -0,0 +1,277 @@
+package com.ycwl.basic.utils;
+
+import com.fasterxml.jackson.core.JsonProcessingException;
+import com.fasterxml.jackson.core.type.TypeReference;
+import com.fasterxml.jackson.databind.JsonNode;
+import com.fasterxml.jackson.databind.ObjectMapper;
+import com.fasterxml.jackson.databind.type.CollectionType;
+import com.fasterxml.jackson.databind.type.TypeFactory;
+
+import java.io.IOException;
+import java.util.List;
+import java.util.Map;
+
+/**
+ * Jackson JSON工具类
+ * 提供简单易用的JSON序列化和反序列化功能
+ */
+public class JacksonUtil {
+
+ private static final ObjectMapper objectMapper = new ObjectMapper();
+
+ /**
+ * 对象转JSON字符串
+ * @param obj 要转换的对象
+ * @return JSON字符串
+ */
+ public static String toJson(Object obj) {
+ try {
+ return objectMapper.writeValueAsString(obj);
+ } catch (JsonProcessingException e) {
+ throw new RuntimeException("对象转JSON失败", e);
+ }
+ }
+
+ /**
+ * JSON字符串转对象
+ * @param json JSON字符串
+ * @param clazz 目标类型
+ * @param 泛型类型
+ * @return 转换后的对象
+ */
+ public static T fromJson(String json, Class clazz) {
+ try {
+ return objectMapper.readValue(json, clazz);
+ } catch (IOException e) {
+ throw new RuntimeException("JSON转对象失败", e);
+ }
+ }
+
+ /**
+ * JSON字符串转对象(支持复杂类型)
+ * @param json JSON字符串
+ * @param typeReference 类型引用
+ * @param 泛型类型
+ * @return 转换后的对象
+ */
+ public static T fromJson(String json, TypeReference typeReference) {
+ try {
+ return objectMapper.readValue(json, typeReference);
+ } catch (IOException e) {
+ throw new RuntimeException("JSON转对象失败", e);
+ }
+ }
+
+ /**
+ * JSON字符串转List
+ * @param json JSON字符串
+ * @param elementClass 列表元素类型
+ * @param 泛型类型
+ * @return List对象
+ */
+ public static List fromJsonToList(String json, Class elementClass) {
+ try {
+ TypeFactory typeFactory = objectMapper.getTypeFactory();
+ CollectionType listType = typeFactory.constructCollectionType(List.class, elementClass);
+ return objectMapper.readValue(json, listType);
+ } catch (IOException e) {
+ throw new RuntimeException("JSON转List失败", e);
+ }
+ }
+
+ /**
+ * JSON字符串转Map
+ * @param json JSON字符串
+ * @return Map对象
+ */
+ public static Map fromJsonToMap(String json) {
+ try {
+ return objectMapper.readValue(json, new TypeReference
-
-
- com.alibaba
- fastjson
- ${fastjson.version}
-
diff --git a/src/main/java/com/ycwl/basic/aspectj/RequestParameterAspectj.java b/src/main/java/com/ycwl/basic/aspectj/RequestParameterAspectj.java
index 1da21f2..a00b864 100644
--- a/src/main/java/com/ycwl/basic/aspectj/RequestParameterAspectj.java
+++ b/src/main/java/com/ycwl/basic/aspectj/RequestParameterAspectj.java
@@ -1,6 +1,6 @@
package com.ycwl.basic.aspectj;
-import com.alibaba.fastjson.JSON;
+import com.ycwl.basic.utils.JacksonUtil;
import com.ycwl.basic.annotation.IgnoreLogReq;
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.Around;
@@ -67,10 +67,10 @@ public class RequestParameterAspectj {
}
if (parameterUrlMap.isEmpty()) {
- LOGGER.info("当前请求的路径为-> {} 请求方式为-> {} 参数为-> {}", requestURI, method, JSON.toJSONString(parameterValueSet));
+ LOGGER.info("当前请求的路径为-> {} 请求方式为-> {} 参数为-> {}", requestURI, method, JacksonUtil.toJSONString(parameterValueSet));
} else {
LOGGER.info("当前请求的路径为-> {} 请求方式为-> {} 参数为-> {} 路径传参为-> {}", requestURI, method,
- JSON.toJSONString(parameterValueSet), JSON.toJSONString(parameterUrlMap));
+ JacksonUtil.toJSONString(parameterValueSet), JacksonUtil.toJSONString(parameterUrlMap));
}
}
return joinPoint.proceed();
diff --git a/src/main/java/com/ycwl/basic/controller/extern/LyCompatibleController.java b/src/main/java/com/ycwl/basic/controller/extern/LyCompatibleController.java
index 1ffb44b..6b4f6b3 100644
--- a/src/main/java/com/ycwl/basic/controller/extern/LyCompatibleController.java
+++ b/src/main/java/com/ycwl/basic/controller/extern/LyCompatibleController.java
@@ -1,7 +1,7 @@
package com.ycwl.basic.controller.extern;
import cn.hutool.core.date.DateUtil;
-import com.alibaba.fastjson.JSON;
+import com.ycwl.basic.utils.JacksonUtil;
import com.ycwl.basic.annotation.IgnoreToken;
import com.ycwl.basic.mapper.FaceMapper;
import com.ycwl.basic.mapper.MemberMapper;
@@ -184,7 +184,7 @@ public class LyCompatibleController {
}
String openId = headersMap.get("client");
if (redisTemplate.hasKey("ly:"+openId)) {
- return JSON.parseObject(redisTemplate.opsForValue().get("ly:"+openId), R.class);
+ return JacksonUtil.parseObject(redisTemplate.opsForValue().get("ly:"+openId), R.class);
}
MemberRespVO member = memberMapper.getByOpenId(openId);
if (member == null) {
@@ -248,7 +248,7 @@ public class LyCompatibleController {
.put("face_id", faceVO.getId().toString())
.put("newvideo", videoList)
.put("newuservideo", userVideoList);
- redisTemplate.opsForValue().set("ly:"+openId, JSON.toJSONString(response), 5, TimeUnit.SECONDS);
+ redisTemplate.opsForValue().set("ly:"+openId, JacksonUtil.toJSONString(response), 5, TimeUnit.SECONDS);
log.info("> {}", response);
return response;
}
diff --git a/src/main/java/com/ycwl/basic/controller/viid/ViidController.java b/src/main/java/com/ycwl/basic/controller/viid/ViidController.java
index b05698c..9bda39d 100644
--- a/src/main/java/com/ycwl/basic/controller/viid/ViidController.java
+++ b/src/main/java/com/ycwl/basic/controller/viid/ViidController.java
@@ -3,7 +3,7 @@ package com.ycwl.basic.controller.viid;
import cn.hutool.core.collection.CollUtil;
import cn.hutool.core.thread.ThreadFactoryBuilder;
import cn.hutool.core.util.ObjectUtil;
-import com.alibaba.fastjson.JSON;
+import com.ycwl.basic.utils.JacksonUtil;
import com.ycwl.basic.annotation.IgnoreLogReq;
import com.ycwl.basic.annotation.IgnoreToken;
import com.ycwl.basic.facebody.adapter.IFaceBodyAdapter;
@@ -377,7 +377,7 @@ public class ViidController {
String _sourceUrl = scenicStorageAdapter.uploadFile(_finalFile, filename);
scenicStorageAdapter.setAcl(StorageAcl.PUBLIC_READ, filename);
source.setUrl(_sourceUrl);
- source.setPosJson(JSON.toJSONString(facePosition));
+ source.setPosJson(JacksonUtil.toJSONString(facePosition));
sourceMapper.add(source);
}
});
diff --git a/src/main/java/com/ycwl/basic/device/checker/helper/CommonDeviceChecker.java b/src/main/java/com/ycwl/basic/device/checker/helper/CommonDeviceChecker.java
index b1a5658..54184a1 100644
--- a/src/main/java/com/ycwl/basic/device/checker/helper/CommonDeviceChecker.java
+++ b/src/main/java/com/ycwl/basic/device/checker/helper/CommonDeviceChecker.java
@@ -1,6 +1,6 @@
package com.ycwl.basic.device.checker.helper;
-import com.alibaba.fastjson.JSON;
+import com.ycwl.basic.utils.JacksonUtil;
import com.ycwl.basic.model.pc.device.entity.DeviceConfigEntity;
import com.ycwl.basic.model.pc.device.entity.DeviceEntity;
import lombok.Setter;
@@ -13,7 +13,7 @@ public abstract class CommonDeviceChecker {
protected DeviceConfigEntity deviceConfig;
public CommonDeviceChecker(String configJson) {
- config = JSON.parseObject(configJson, getConfigClass());
+ config = JacksonUtil.parseObject(configJson, getConfigClass());
}
@SuppressWarnings("unchecked")
diff --git a/src/main/java/com/ycwl/basic/device/operator/AliOssStorageOperator.java b/src/main/java/com/ycwl/basic/device/operator/AliOssStorageOperator.java
index d3d71d9..f6a2f35 100644
--- a/src/main/java/com/ycwl/basic/device/operator/AliOssStorageOperator.java
+++ b/src/main/java/com/ycwl/basic/device/operator/AliOssStorageOperator.java
@@ -1,7 +1,7 @@
package com.ycwl.basic.device.operator;
import cn.hutool.core.date.DateUtil;
-import com.alibaba.fastjson.JSON;
+import com.ycwl.basic.utils.JacksonUtil;
import com.ycwl.basic.device.entity.common.FileObject;
import com.ycwl.basic.storage.StorageFactory;
import com.ycwl.basic.storage.adapters.IStorageAdapter;
@@ -28,7 +28,7 @@ public class AliOssStorageOperator extends ADeviceStorageOperator {
@Override
public void loadConfig(String configJson) {
- AliOssStorageConfig config = JSON.parseObject(configJson, AliOssStorageConfig.class);
+ AliOssStorageConfig config = JacksonUtil.parseObject(configJson, AliOssStorageConfig.class);
adapter = StorageFactory.get(StorageType.ALI_OSS, config);
}
diff --git a/src/main/java/com/ycwl/basic/device/operator/VptPassiveStorageOperator.java b/src/main/java/com/ycwl/basic/device/operator/VptPassiveStorageOperator.java
index af69c23..83bb864 100644
--- a/src/main/java/com/ycwl/basic/device/operator/VptPassiveStorageOperator.java
+++ b/src/main/java/com/ycwl/basic/device/operator/VptPassiveStorageOperator.java
@@ -1,7 +1,6 @@
package com.ycwl.basic.device.operator;
-import com.alibaba.fastjson.JSON;
-import com.alibaba.fastjson.annotation.JSONField;
+import com.ycwl.basic.utils.JacksonUtil;
import com.fasterxml.jackson.annotation.JsonFormat;
import com.ycwl.basic.device.entity.common.FileObject;
import com.ycwl.basic.device.entity.vpt_passive.VptPassiveStorageConfig;
@@ -29,10 +28,8 @@ public class VptPassiveStorageOperator extends ADeviceStorageOperator {
public Long scenicId;
public Long deviceId;
public String deviceNo;
- @JSONField(format = "yyyy-MM-dd HH:mm:ss")
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
public Date startTime;
- @JSONField(format = "yyyy-MM-dd HH:mm:ss")
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
public Date endTime;
}
@@ -75,7 +72,7 @@ public class VptPassiveStorageOperator extends ADeviceStorageOperator {
@Override
public void loadConfig(String configJson) {
- this.config = JSON.parseObject(configJson, VptPassiveStorageConfig.class);
+ this.config = JacksonUtil.parseObject(configJson, VptPassiveStorageConfig.class);
}
@Override
@@ -94,7 +91,7 @@ public class VptPassiveStorageOperator extends ADeviceStorageOperator {
if (redisTemplate == null) {
taskList.add(task);
} else {
- redisTemplate.opsForValue().set(String.format(TASK_KEY, task.scenicId, task.deviceNo) + task.taskId, JSON.toJSONString(task), 10 * 60L, TimeUnit.SECONDS);
+ redisTemplate.opsForValue().set(String.format(TASK_KEY, task.scenicId, task.deviceNo) + task.taskId, JacksonUtil.toJSONString(task), 10 * 60L, TimeUnit.SECONDS);
}
log.info("任务{}获取视频开始!共{}", task.taskId, taskList.size());
Date taskStartTime = new Date();
diff --git a/src/main/java/com/ycwl/basic/device/operator/WvpActiveStorageOperator.java b/src/main/java/com/ycwl/basic/device/operator/WvpActiveStorageOperator.java
index 1d86205..88b189e 100644
--- a/src/main/java/com/ycwl/basic/device/operator/WvpActiveStorageOperator.java
+++ b/src/main/java/com/ycwl/basic/device/operator/WvpActiveStorageOperator.java
@@ -3,8 +3,8 @@ package com.ycwl.basic.device.operator;
import cn.hutool.crypto.digest.MD5;
import cn.hutool.http.HttpRequest;
import cn.hutool.http.HttpUtil;
-import com.alibaba.fastjson.JSON;
-import com.alibaba.fastjson.JSONObject;
+import com.ycwl.basic.utils.JacksonUtil;
+import com.fasterxml.jackson.core.type.TypeReference;
import com.ycwl.basic.device.entity.common.FileObject;
import com.ycwl.basic.device.entity.wvp_active.WvpActiveStorageConfig;
import com.ycwl.basic.storage.exceptions.StorageConfigException;
@@ -30,7 +30,7 @@ public class WvpActiveStorageOperator extends ADeviceStorageOperator {
@Override
public void loadConfig(String configJson) {
- this.config = JSON.parseObject(configJson, WvpActiveStorageConfig.class);
+ this.config = JacksonUtil.parseObject(configJson, WvpActiveStorageConfig.class);
}
@Override
@@ -55,13 +55,14 @@ public class WvpActiveStorageOperator extends ADeviceStorageOperator {
String password = MD5.create().digestHex(this.config.getLoginPassword());
params.put("password", password);
String jsonResult = HttpUtil.get(url, params);
- JSONObject result = JSON.parseObject(jsonResult);
- if (result.getInteger("code") == 0) {
- JSONObject data = result.getJSONObject("data");
- this.token = data.getString("accessToken");
+ Map result = JacksonUtil.parseObject(jsonResult, Map.class);
+ Integer code = (Integer) result.get("code");
+ if (code != null && code == 0) {
+ Map data = (Map) result.get("data");
+ this.token = (String) data.get("accessToken");
return this.token;
} else {
- throw new StorageConfigException("获取token失败,原因为:" + result.getString("msg"));
+ throw new StorageConfigException("获取token失败,原因为:" + result.get("msg"));
}
}
public List listDirByDtRange(Date startDate, Date endDate) {
@@ -75,19 +76,23 @@ public class WvpActiveStorageOperator extends ADeviceStorageOperator {
params.put("page", 1);
params.put("count", 100);
String jsonResult = HttpRequest.get(url).form(params).header("Access-Token", getToken()).execute().body();
- JSONObject result = JSON.parseObject(jsonResult);
- if (result.getInteger("code") == 0) {
- JSONObject data = result.getJSONObject("data");
- List recordList = data.getJSONArray("list").toJavaList(JSONObject.class);
+ Map result = JacksonUtil.parseObject(jsonResult, Map.class);
+ Integer code = (Integer) result.get("code");
+ if (code != null && code == 0) {
+ Map data = (Map) result.get("data");
+ List