mirror of
				https://github.com/continew-org/continew-starter.git
				synced 2025-10-31 10:57:15 +08:00 
			
		
		
		
	fix(log/core): 修复访问日志json数组打印
对于请求参数的 json 数组打印和处理的问题修复 适配 json 数组打印处理,json 模块增加 JSONUtil 和 JsonBuilder
This commit is contained in:
		| @@ -0,0 +1,239 @@ | ||||
| /* | ||||
|  * Copyright (c) 2022-present Charles7c Authors. All Rights Reserved. | ||||
|  * <p> | ||||
|  * Licensed under the GNU LESSER GENERAL PUBLIC LICENSE 3.0; | ||||
|  * you may not use this file except in compliance with the License. | ||||
|  * You may obtain a copy of the License at | ||||
|  * <p> | ||||
|  * http://www.gnu.org/licenses/lgpl.html | ||||
|  * <p> | ||||
|  * Unless required by applicable law or agreed to in writing, software | ||||
|  * distributed under the License is distributed on an "AS IS" BASIS, | ||||
|  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | ||||
|  * See the License for the specific language governing permissions and | ||||
|  * limitations under the License. | ||||
|  */ | ||||
|  | ||||
| package top.continew.starter.json.jackson.util; | ||||
|  | ||||
| import cn.hutool.core.util.ObjectUtil; | ||||
| import cn.hutool.core.util.StrUtil; | ||||
| import cn.hutool.extra.spring.SpringUtil; | ||||
| 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 java.io.IOException; | ||||
| import java.util.ArrayList; | ||||
| import java.util.List; | ||||
| import java.util.Map; | ||||
|  | ||||
| /** | ||||
|  * json 工具 | ||||
|  * | ||||
|  * @author echo | ||||
|  * @since 2025/03/31 | ||||
|  */ | ||||
| public class JSONUtil { | ||||
|     /** | ||||
|      * 私有构造函数,防止实例化。 | ||||
|      */ | ||||
|     private JSONUtil() { | ||||
|     } | ||||
|  | ||||
|     /** | ||||
|      * Jackson 对象映射器,用于 JSON 解析与序列化。 | ||||
|      */ | ||||
|     private static final ObjectMapper OBJECT_MAPPER = SpringUtil.getBean(ObjectMapper.class); | ||||
|  | ||||
|     /** | ||||
|      * 获取 Jackson 对象映射器。 | ||||
|      * | ||||
|      * @return {@link ObjectMapper} Jackson 对象映射器 | ||||
|      */ | ||||
|     public static ObjectMapper getObjectMapper() { | ||||
|         return OBJECT_MAPPER; | ||||
|     } | ||||
|  | ||||
|     /** | ||||
|      * 对象转为 json 字符串 | ||||
|      * | ||||
|      * @param object 对象 | ||||
|      * @return {@link String } | ||||
|      */ | ||||
|     public static String toJsonStr(Object object) { | ||||
|         if (ObjectUtil.isNull(object)) { | ||||
|             return null; | ||||
|         } | ||||
|         try { | ||||
|             return OBJECT_MAPPER.writeValueAsString(object); | ||||
|         } catch (JsonProcessingException e) { | ||||
|             throw new RuntimeException(e); | ||||
|         } | ||||
|     } | ||||
|  | ||||
|     /** | ||||
|      * 将对象转换为 JsonNode。 | ||||
|      * | ||||
|      * @param obj 需要转换的对象 | ||||
|      * @return 转换后的 {@link JsonNode},如果 obj 为空,则返回 null | ||||
|      */ | ||||
|     public static JsonNode toJson(Object obj) { | ||||
|         if (obj == null) { | ||||
|             return null; | ||||
|         } | ||||
|         try { | ||||
|             return OBJECT_MAPPER.valueToTree(obj); | ||||
|         } catch (IllegalArgumentException e) { | ||||
|             throw new IllegalArgumentException(e); | ||||
|         } | ||||
|     } | ||||
|  | ||||
|     /** | ||||
|      * 将 List 转换为 JsonNode。 | ||||
|      * | ||||
|      * @param list 输入的 List | ||||
|      * @return 转换后的 {@link JsonNode} | ||||
|      */ | ||||
|     public static JsonNode listToJson(List<?> list) { | ||||
|         return toJson(list); | ||||
|     } | ||||
|  | ||||
|     /** | ||||
|      * 将 Map 转换为 JsonNode。 | ||||
|      * | ||||
|      * @param map 输入的 Map | ||||
|      * @return 转换后的 {@link JsonNode} | ||||
|      */ | ||||
|     public static JsonNode mapToJson(Map<?, ?> map) { | ||||
|         return toJson(map); | ||||
|     } | ||||
|  | ||||
|     /** | ||||
|      * 将 JsonNode 转换为 List<String>,用于环境变量格式解析。 | ||||
|      * | ||||
|      * @param jsonNode 需要转换的 JsonNode | ||||
|      * @return 转换后的 List<String> | ||||
|      */ | ||||
|     public static List<String> jsonToEnvList(JsonNode jsonNode) { | ||||
|         if (jsonNode == null || jsonNode.isNull()) { | ||||
|             return new ArrayList<>(); | ||||
|         } | ||||
|         List<String> envList = new ArrayList<>(); | ||||
|         jsonNode.fields().forEachRemaining(field -> { | ||||
|             String key = field.getKey(); | ||||
|             JsonNode valueNode = field.getValue(); | ||||
|             String value = valueNode.isValueNode() ? valueNode.asText() : valueNode.toString(); | ||||
|             envList.add(key + "=" + value); | ||||
|         }); | ||||
|         return envList; | ||||
|     } | ||||
|  | ||||
|     /** | ||||
|      * 将 JsonNode 转换为 List<String>。 | ||||
|      * | ||||
|      * @param jsonNode 需要转换的 JsonNode | ||||
|      * @return 转换后的 List<String> | ||||
|      */ | ||||
|     public static List<String> jsonToStringList(JsonNode jsonNode) { | ||||
|         if (jsonNode == null || jsonNode.isNull()) { | ||||
|             return new ArrayList<>(); | ||||
|         } | ||||
|         try { | ||||
|             return OBJECT_MAPPER.convertValue(jsonNode, new TypeReference<>() { | ||||
|             }); | ||||
|         } catch (IllegalArgumentException e) { | ||||
|             throw new IllegalArgumentException(e); | ||||
|         } | ||||
|     } | ||||
|  | ||||
|     /** | ||||
|      * 将 JsonNode 转换为指定类型的 Java 对象。 | ||||
|      * | ||||
|      * @param jsonNode JSON 数据 | ||||
|      * @param clazz    目标 Java 类 | ||||
|      * @return 解析后的 Java 对象 | ||||
|      */ | ||||
|     public static <T> T fromJson(JsonNode jsonNode, Class<T> clazz) { | ||||
|         try { | ||||
|             return OBJECT_MAPPER.treeToValue(jsonNode, clazz); | ||||
|         } catch (JsonProcessingException e) { | ||||
|             throw new RuntimeException(e); | ||||
|         } | ||||
|     } | ||||
|  | ||||
|     /** | ||||
|      * 解析 JSON 字符串为 Java 对象。 | ||||
|      * | ||||
|      * @param str   JSON 字符串 | ||||
|      * @param clazz 目标 Java 类 | ||||
|      * @return 解析后的 Java 对象 | ||||
|      */ | ||||
|     public static <T> T parseObject(String str, Class<T> clazz) { | ||||
|         if (StrUtil.isEmpty(str)) { | ||||
|             return null; | ||||
|         } | ||||
|         try { | ||||
|             return OBJECT_MAPPER.readValue(str, clazz); | ||||
|         } catch (IOException e) { | ||||
|             throw new RuntimeException(e); | ||||
|         } | ||||
|     } | ||||
|  | ||||
|     /** | ||||
|      * 字符串 解析为 list<T> | ||||
|      * | ||||
|      * @param str   字符串 | ||||
|      * @param clazz 目标 Java 类 | ||||
|      * @return 解析后的 List<T> | ||||
|      */ | ||||
|     public static <T> List<T> parseArray(String str, Class<T> clazz) { | ||||
|         if (StrUtil.isEmpty(str)) { | ||||
|             return new ArrayList<>(); | ||||
|         } | ||||
|         try { | ||||
|             return OBJECT_MAPPER.readValue(str, OBJECT_MAPPER.getTypeFactory() | ||||
|                 .constructCollectionType(List.class, clazz)); | ||||
|         } catch (IOException e) { | ||||
|             throw new RuntimeException(e); | ||||
|         } | ||||
|     } | ||||
|  | ||||
|     /** | ||||
|      * 判断字符串是否为 JSON 格式。 | ||||
|      * | ||||
|      * @param str 字符串 | ||||
|      * @return 是否为 JSON 格式 | ||||
|      */ | ||||
|     public static boolean isTypeJSON(String str) { | ||||
|         if (StrUtil.isEmpty(str)) { | ||||
|             return false; | ||||
|         } | ||||
|         try { | ||||
|             OBJECT_MAPPER.readTree(str); | ||||
|             return true; | ||||
|         } catch (IOException e) { | ||||
|             return false; | ||||
|         } | ||||
|     } | ||||
|  | ||||
|     /** | ||||
|      * 将 JSON 字符串转换为指定类型的 Java 对象。 | ||||
|      * | ||||
|      * @param str   字符串 | ||||
|      * @param clazz 目标对象的 Class 类型 | ||||
|      * @return 解析后的 Java 对象 | ||||
|      */ | ||||
|     public static <T> T toBean(String str, Class<T> clazz) { | ||||
|         if (StrUtil.isEmpty(str)) { | ||||
|             return null; | ||||
|         } | ||||
|         try { | ||||
|             return OBJECT_MAPPER.readValue(str, clazz); | ||||
|         } catch (IOException e) { | ||||
|             throw new RuntimeException(e); | ||||
|         } | ||||
|     } | ||||
|  | ||||
| } | ||||
| @@ -0,0 +1,206 @@ | ||||
| /* | ||||
|  * Copyright (c) 2022-present Charles7c Authors. All Rights Reserved. | ||||
|  * <p> | ||||
|  * Licensed under the GNU LESSER GENERAL PUBLIC LICENSE 3.0; | ||||
|  * you may not use this file except in compliance with the License. | ||||
|  * You may obtain a copy of the License at | ||||
|  * <p> | ||||
|  * http://www.gnu.org/licenses/lgpl.html | ||||
|  * <p> | ||||
|  * Unless required by applicable law or agreed to in writing, software | ||||
|  * distributed under the License is distributed on an "AS IS" BASIS, | ||||
|  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | ||||
|  * See the License for the specific language governing permissions and | ||||
|  * limitations under the License. | ||||
|  */ | ||||
|  | ||||
| package top.continew.starter.json.jackson.util; | ||||
|  | ||||
| import cn.hutool.extra.spring.SpringUtil; | ||||
| import com.fasterxml.jackson.databind.JsonNode; | ||||
| import com.fasterxml.jackson.databind.ObjectMapper; | ||||
| import com.fasterxml.jackson.databind.node.ArrayNode; | ||||
| import com.fasterxml.jackson.databind.node.ObjectNode; | ||||
|  | ||||
| import java.util.List; | ||||
| import java.util.Map; | ||||
| import java.util.Objects; | ||||
|  | ||||
| /** | ||||
|  * json 构建工具 | ||||
|  * | ||||
|  * @author echo | ||||
|  * @since 2025/03/31 | ||||
|  */ | ||||
| public class JsonBuilder { | ||||
|  | ||||
|     private static final ObjectMapper OBJECT_MAPPER = SpringUtil.getBean(ObjectMapper.class); | ||||
|     private final ObjectNode rootNode; | ||||
|  | ||||
|     private JsonBuilder() { | ||||
|         this.rootNode = OBJECT_MAPPER.createObjectNode(); | ||||
|     } | ||||
|  | ||||
|     /** | ||||
|      * 开始构建 | ||||
|      * | ||||
|      * @return {@link JsonBuilder } | ||||
|      */ | ||||
|     public static JsonBuilder builder() { | ||||
|         return new JsonBuilder(); | ||||
|     } | ||||
|  | ||||
|     /** | ||||
|      * 添加 字符串 | ||||
|      * | ||||
|      * @param key   key 值 | ||||
|      * @param value 值 | ||||
|      * @return {@link JsonBuilder } | ||||
|      */ | ||||
|     public JsonBuilder add(String key, String value) { | ||||
|         Objects.requireNonNull(key, "键不能为 null"); | ||||
|         if (value != null) { | ||||
|             rootNode.put(key, value); | ||||
|         } | ||||
|         return this; | ||||
|     } | ||||
|  | ||||
|     /** | ||||
|      * 添加 int | ||||
|      * | ||||
|      * @param key   key 值 | ||||
|      * @param value 值 | ||||
|      * @return {@link JsonBuilder } | ||||
|      */ | ||||
|     public JsonBuilder add(String key, int value) { | ||||
|         Objects.requireNonNull(key, "键不能为 null"); | ||||
|         rootNode.put(key, value); | ||||
|         return this; | ||||
|     } | ||||
|  | ||||
|     /** | ||||
|      * 添加 long | ||||
|      * | ||||
|      * @param key   key 值 | ||||
|      * @param value 值 | ||||
|      * @return {@link JsonBuilder } | ||||
|      */ | ||||
|     public JsonBuilder add(String key, long value) { | ||||
|         Objects.requireNonNull(key, "键不能为 null"); | ||||
|         rootNode.put(key, value); | ||||
|         return this; | ||||
|     } | ||||
|  | ||||
|     /** | ||||
|      * 添加 布尔 | ||||
|      * | ||||
|      * @param key   key 值 | ||||
|      * @param value 值 | ||||
|      * @return {@link JsonBuilder } | ||||
|      */ | ||||
|     public JsonBuilder add(String key, boolean value) { | ||||
|         Objects.requireNonNull(key, "键不能为 null"); | ||||
|         rootNode.put(key, value); | ||||
|         return this; | ||||
|     } | ||||
|  | ||||
|     /** | ||||
|      * 添加 浮点 | ||||
|      * | ||||
|      * @param key   key 值 | ||||
|      * @param value 值 | ||||
|      * @return {@link JsonBuilder } | ||||
|      */ | ||||
|     public JsonBuilder add(String key, double value) { | ||||
|         Objects.requireNonNull(key, "键不能为 null"); | ||||
|         rootNode.put(key, value); | ||||
|         return this; | ||||
|     } | ||||
|  | ||||
|     /** | ||||
|      * 添加 json | ||||
|      * | ||||
|      * @param key   key 值 | ||||
|      * @param value 值 | ||||
|      * @return {@link JsonBuilder } | ||||
|      */ | ||||
|     public JsonBuilder add(String key, JsonNode value) { | ||||
|         Objects.requireNonNull(key, "键不能为 null"); | ||||
|         if (value != null) { | ||||
|             rootNode.set(key, value); | ||||
|         } | ||||
|         return this; | ||||
|     } | ||||
|  | ||||
|     /** | ||||
|      * 添加 Object | ||||
|      * | ||||
|      * @param key   key 值 | ||||
|      * @param value 值 | ||||
|      * @return {@link JsonBuilder } | ||||
|      */ | ||||
|     public JsonBuilder add(String key, Object value) { | ||||
|         Objects.requireNonNull(key, "键不能为 null"); | ||||
|         if (value != null) { | ||||
|             rootNode.set(key, OBJECT_MAPPER.valueToTree(value)); | ||||
|         } | ||||
|         return this; | ||||
|     } | ||||
|  | ||||
|     /** | ||||
|      * 添加 List 到 JSON | ||||
|      * | ||||
|      * @param key  key 值 | ||||
|      * @param list list 参数 | ||||
|      * @return {@link JsonBuilder } | ||||
|      */ | ||||
|     public JsonBuilder add(String key, List<?> list) { | ||||
|         Objects.requireNonNull(key, "键不能为 null"); | ||||
|         if (list != null) { | ||||
|             ArrayNode arrayNode = OBJECT_MAPPER.createArrayNode(); | ||||
|             for (Object item : list) { | ||||
|                 arrayNode.add(OBJECT_MAPPER.valueToTree(item)); | ||||
|             } | ||||
|             rootNode.set(key, arrayNode); | ||||
|         } | ||||
|         return this; | ||||
|     } | ||||
|  | ||||
|     /** | ||||
|      * 添加 Map 到 JSON | ||||
|      * | ||||
|      * @param key key 值 | ||||
|      * @param map map 参数 | ||||
|      * @return {@link JsonBuilder } | ||||
|      */ | ||||
|     public JsonBuilder add(String key, Map<?, ?> map) { | ||||
|         Objects.requireNonNull(key, "键不能为 null"); | ||||
|         if (map != null) { | ||||
|             ObjectNode objectNode = OBJECT_MAPPER.valueToTree(map); | ||||
|             rootNode.set(key, objectNode); | ||||
|         } | ||||
|         return this; | ||||
|     } | ||||
|  | ||||
|     /** | ||||
|      * 构建 | ||||
|      * | ||||
|      * @return {@link JsonNode } | ||||
|      */ | ||||
|     public JsonNode build() { | ||||
|         return rootNode; | ||||
|     } | ||||
|  | ||||
|     /** | ||||
|      * 构建 json 字符串 | ||||
|      * | ||||
|      * @return {@link String } | ||||
|      */ | ||||
|     public String buildString() { | ||||
|         try { | ||||
|             return rootNode.toString(); | ||||
|         } catch (Exception e) { | ||||
|             throw new RuntimeException("构建 JSON 字符串失败", e); | ||||
|         } | ||||
|     } | ||||
| } | ||||
		Reference in New Issue
	
	Block a user
	 吴泽威
					吴泽威