From e4f03294fdd120beb51bd9e3eda2ff081447a114 Mon Sep 17 00:00:00 2001 From: FeiWuSama <1825578184@qq.com> Date: Thu, 1 Jan 2026 12:57:32 +0800 Subject: [PATCH] =?UTF-8?q?fix(ObjectMapper):=E8=A7=A3=E5=86=B3=E6=8E=89?= =?UTF-8?q?=E8=BF=87=E6=BB=A4=E5=99=A8=E5=AF=B9Bean=E6=97=A0=E6=95=88?= =?UTF-8?q?=E7=9A=84=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/cn/hutool/json/InternalJSONUtil.java | 24 +++++++++++++++++++ .../java/cn/hutool/json/ObjectMapper.java | 16 ++++++++++--- 2 files changed, 37 insertions(+), 3 deletions(-) diff --git a/hutool-json/src/main/java/cn/hutool/json/InternalJSONUtil.java b/hutool-json/src/main/java/cn/hutool/json/InternalJSONUtil.java index 0f3ce637fa..2431a60c78 100755 --- a/hutool-json/src/main/java/cn/hutool/json/InternalJSONUtil.java +++ b/hutool-json/src/main/java/cn/hutool/json/InternalJSONUtil.java @@ -191,6 +191,30 @@ public final class InternalJSONUtil { .setTransientSupport(config.isTransientSupport()); } + /** + * 将 {@link JSONConfig} 的参数和过滤器 {@link Filter}转换为 Bean 拷贝所需的 {@link CopyOptions} + * + * @param config {@link JSONConfig} + * @param filter {@link Filter} + * @return {@link CopyOptions} + */ + static CopyOptions toCopyOptions(JSONConfig config, Filter> filter) { + CopyOptions copyOptions = CopyOptions.create() + .setIgnoreCase(config.isIgnoreCase()) + .setIgnoreError(config.isIgnoreError()) + .setIgnoreNullValue(config.isIgnoreNullValue()) + .setTransientSupport(config.isTransientSupport()); + + if (filter != null) { + copyOptions.setPropertiesFilter((field, value) -> { + MutablePair pair = new MutablePair<>(field.getName(), value); + return filter.accept(pair); + }); + } + + return copyOptions; + } + /** * 根据配置创建对应的原始Map * diff --git a/hutool-json/src/main/java/cn/hutool/json/ObjectMapper.java b/hutool-json/src/main/java/cn/hutool/json/ObjectMapper.java index 1425f2ad3d..2e5df569a1 100755 --- a/hutool-json/src/main/java/cn/hutool/json/ObjectMapper.java +++ b/hutool-json/src/main/java/cn/hutool/json/ObjectMapper.java @@ -110,11 +110,10 @@ public class ObjectMapper { // JSONTokener mapFromResourceBundle((ResourceBundle) source, jsonObject, filter); } else if (RecordUtil.isRecord(source.getClass())) { - mapFromBean(source, jsonObject); + mapFromBean(source, jsonObject,filter); } else if (BeanUtil.isReadableBean(source.getClass())) { // 普通Bean - // TODO 过滤器对Bean无效,需补充。 - mapFromBean(source, jsonObject); + mapFromBean(source, jsonObject,filter); } // 跳过空对象 @@ -263,7 +262,18 @@ public class ObjectMapper { * @param bean Bean对象 * @param jsonObject {@link JSONObject} */ + @Deprecated private static void mapFromBean(Object bean, JSONObject jsonObject) { BeanUtil.beanToMap(bean, jsonObject, InternalJSONUtil.toCopyOptions(jsonObject.getConfig())); } + + /** + * 从Bean转换(可添加过滤器) + * @param bean Bean对象 + * @param jsonObject {@link JSONObject} + * @param filter {@link Filter} + */ + private static void mapFromBean(Object bean, JSONObject jsonObject,Filter> filter) { + BeanUtil.beanToMap(bean, jsonObject, InternalJSONUtil.toCopyOptions(jsonObject.getConfig(), filter)); + } }