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