diff --git a/hutool-http/src/test/java/org/dromara/hutool/http/IssueIAFKWPTest.java b/hutool-http/src/test/java/org/dromara/hutool/http/IssueIAFKWPTest.java index e49ab65bf..7dbe788d6 100644 --- a/hutool-http/src/test/java/org/dromara/hutool/http/IssueIAFKWPTest.java +++ b/hutool-http/src/test/java/org/dromara/hutool/http/IssueIAFKWPTest.java @@ -32,7 +32,7 @@ public class IssueIAFKWPTest { @Test void urlWithFormTest() { final JSONObject obj = JSONUtil.ofObj(); - obj.set("fields", ListUtil.of("1", "2", "good")); + obj.putObj("fields", ListUtil.of("1", "2", "good")); final Map params = new HashMap<>(); params.put("query", obj.toString()); diff --git a/hutool-http/src/test/java/org/dromara/hutool/http/RestTest.java b/hutool-http/src/test/java/org/dromara/hutool/http/RestTest.java index c9ce9c2b6..9ed573241 100644 --- a/hutool-http/src/test/java/org/dromara/hutool/http/RestTest.java +++ b/hutool-http/src/test/java/org/dromara/hutool/http/RestTest.java @@ -38,8 +38,8 @@ public class RestTest { final Request request = Request.of("http://localhost:8090/rest/restTest/") .method(Method.POST) .body(JSONUtil.ofObj() - .set("aaa", "aaaValue") - .set("键2", "值2").toString()); + .putObj("aaa", "aaaValue") + .putObj("键2", "值2").toString()); Assertions.assertEquals("application/json;charset=UTF-8", request.header(HeaderName.CONTENT_TYPE)); } @@ -50,8 +50,8 @@ public class RestTest { final Request request = Request.of("http://localhost:8090/rest/restTest/") .method(Method.POST) .body(JSONUtil.ofObj() - .set("aaa", "aaaValue") - .set("键2", "值2").toString()); + .putObj("aaa", "aaaValue") + .putObj("键2", "值2").toString()); Console.log(request.send().body()); } @@ -59,8 +59,8 @@ public class RestTest { @Disabled public void postTest2() { final String result = HttpUtil.post("http://localhost:8090/rest/restTest/", JSONUtil.ofObj()// - .set("aaa", "aaaValue") - .set("键2", "值2").toString()); + .putObj("aaa", "aaaValue") + .putObj("键2", "值2").toString()); Console.log(result); } @@ -70,8 +70,8 @@ public class RestTest { final Request request = Request.of("http://localhost:8888/restTest")// .header(HeaderName.CONTENT_TYPE, "application/json") .body(JSONUtil.ofObj() - .set("aaa", "aaaValue") - .set("键2", "值2").toString()); + .putObj("aaa", "aaaValue") + .putObj("键2", "值2").toString()); //noinspection resource Console.log(request.send().body()); } diff --git a/hutool-http/src/test/java/org/dromara/hutool/http/server/SimpleServerTest.java b/hutool-http/src/test/java/org/dromara/hutool/http/server/SimpleServerTest.java index 9228f738a..a23bb5c4c 100644 --- a/hutool-http/src/test/java/org/dromara/hutool/http/server/SimpleServerTest.java +++ b/hutool-http/src/test/java/org/dromara/hutool/http/server/SimpleServerTest.java @@ -44,9 +44,9 @@ public class SimpleServerTest { // 返回JSON数据测试 .addAction("/restTest", (request, response) -> { final String res = JSONUtil.ofObj() - .set("id", 1) - .set("method", request.getMethod()) - .set("request", request.getBody()) + .putObj("id", 1) + .putObj("method", request.getMethod()) + .putObj("request", request.getBody()) .toStringPretty(); response.write(res, ContentType.JSON.toString()); }) diff --git a/hutool-json/src/main/java/org/dromara/hutool/json/InternalJSONUtil.java b/hutool-json/src/main/java/org/dromara/hutool/json/InternalJSONUtil.java index 9a3d213ed..d0444b6e6 100644 --- a/hutool-json/src/main/java/org/dromara/hutool/json/InternalJSONUtil.java +++ b/hutool-json/src/main/java/org/dromara/hutool/json/InternalJSONUtil.java @@ -24,7 +24,6 @@ import org.dromara.hutool.core.map.CaseInsensitiveTreeMap; import org.dromara.hutool.core.text.CharUtil; import org.dromara.hutool.core.text.StrUtil; import org.dromara.hutool.core.util.ObjUtil; -import org.dromara.hutool.json.reader.JSONTokener; import org.dromara.hutool.json.serializer.JSONMapper; import java.io.IOException; @@ -104,25 +103,6 @@ public final class InternalJSONUtil { return string; } - /** - * 默认情况下是否忽略null值的策略选择,以下对象不忽略null值,其它对象忽略: - * - *
-	 *     1. CharSequence
-	 *     2. JSONTokener
-	 *     3. Map
-	 * 
- * - * @param obj 需要检查的对象 - * @return 是否忽略null值 - * @since 4.3.1 - */ - static boolean defaultIgnoreNullValue(final Object obj) { - return (!(obj instanceof CharSequence))// - && (!(obj instanceof JSONTokener))// - && (!(obj instanceof Map)); - } - /** * 将{@link JSONConfig}参数转换为Bean拷贝所用的{@link CopyOptions} * diff --git a/hutool-json/src/main/java/org/dromara/hutool/json/JSONArray.java b/hutool-json/src/main/java/org/dromara/hutool/json/JSONArray.java index 4f937b5ed..b502c24d4 100644 --- a/hutool-json/src/main/java/org/dromara/hutool/json/JSONArray.java +++ b/hutool-json/src/main/java/org/dromara/hutool/json/JSONArray.java @@ -118,9 +118,8 @@ public class JSONArray extends ListWrapper implements JSON, JSONGetter implements JSON, JSONGetter implements JSON, JSONGetter implements JSON, JSONGetter= size()) { - add(index, element); - return null; - } if (null == element && config().isIgnoreNullValue()) { return null; } + + // 越界则追加到指定位置 + final int size = size(); + if(index == size){ + add(element); + return null; + } + if (index > size) { + add(index, element); + return null; + } + return this.raw.set(index, element); } + @Override + public boolean add(final JSON element) { + if (null == element && config().isIgnoreNullValue()) { + return false; + } + return super.add(element); + } + @Override public void add(int index, final JSON element) { final boolean ignoreNullValue = config().isIgnoreNullValue(); diff --git a/hutool-json/src/main/java/org/dromara/hutool/json/JSONFactory.java b/hutool-json/src/main/java/org/dromara/hutool/json/JSONFactory.java index c4e2c54bd..43bfd398a 100644 --- a/hutool-json/src/main/java/org/dromara/hutool/json/JSONFactory.java +++ b/hutool-json/src/main/java/org/dromara/hutool/json/JSONFactory.java @@ -27,6 +27,7 @@ import org.dromara.hutool.json.writer.JSONWriter; import java.io.ByteArrayInputStream; import java.lang.reflect.Type; +import java.util.function.Consumer; import java.util.function.Predicate; /** @@ -66,7 +67,9 @@ public class JSONFactory { private final JSONConfig config; /** - * 过滤器,用于过滤或修改键值对,返回null表示忽略此键值对,返回非null表示修改后返回
+ * 过滤器,用于过滤或修改键值对
+ * {@link Predicate#test(Object)} 返回{@code true}表示接受,{@code false}表示忽略
+ * 同时{@link MutableEntry}为可变键值对,在判断逻辑中可同时修改键和值,修改后返回{@code true}
* entry中,key在JSONObject中为name,在JSONArray中为index */ private final Predicate> predicate; @@ -84,7 +87,7 @@ public class JSONFactory { } /** - * 获取配置项 + * 获取配置项,始终非空 * * @return 配置项 */ @@ -93,7 +96,10 @@ public class JSONFactory { } /** - * 获取键值对过滤器 + * 获取键值对过滤器
+ * {@link Predicate#test(Object)} 返回{@code true}表示接受,{@code false}表示忽略
+ * 同时{@link MutableEntry}为可变键值对,在判断逻辑中可同时修改键和值,修改后返回{@code true}
+ * entry中,key在JSONObject中为name,在JSONArray中为index * * @return 键值对过滤器 */ @@ -101,6 +107,26 @@ public class JSONFactory { return this.predicate; } + /** + * 执行键值对过滤,如果提供的键值对执行{@link Predicate#test(Object)}返回{@code false},则忽略此键值对;
+ * 如果处理后返回{@code true}表示接受,调用{@link Consumer#accept(Object)}执行逻辑。
+ * 如果用户未定义{@link #predicate},则接受所有键值对。 + * + * @param entry 键值对 + * @param consumer 键值对处理逻辑,如果处理后返回{@code true}表示接受,{@code false}表示忽略 + */ + public void doPredicate(final MutableEntry entry, + final Consumer> consumer) { + final Predicate> predicate = this.predicate; + if (null != predicate && !predicate.test(entry)) { + // 过滤键值对 + return; + } + + // 键值对处理 + consumer.accept(entry); + } + /** * 获取{@link JSONMapper},用于实现Bean和JSON的转换
* 此方法使用双重检查锁实现懒加载模式,只有mapper被使用时才初始化 @@ -154,7 +180,7 @@ public class JSONFactory { * @param tokener {@link JSONTokener} * @return {@link JSONParser} */ - public JSONParser ofParser(final JSONTokener tokener){ + public JSONParser ofParser(final JSONTokener tokener) { return JSONParser.of(tokener, this); } diff --git a/hutool-json/src/main/java/org/dromara/hutool/json/JSONObject.java b/hutool-json/src/main/java/org/dromara/hutool/json/JSONObject.java index b3d7b5725..07b51ac18 100644 --- a/hutool-json/src/main/java/org/dromara/hutool/json/JSONObject.java +++ b/hutool-json/src/main/java/org/dromara/hutool/json/JSONObject.java @@ -143,7 +143,7 @@ public class JSONObject extends MapWrapper implements JSON, JSONGe } // endregion - // region ----- set + // region ----- put /** * 对值加一,如果值不存在,赋值1,如果为数字类型,做加一操作 * @@ -154,7 +154,7 @@ public class JSONObject extends MapWrapper implements JSON, JSONGe public JSONObject increment(final String key) throws JSONException { final JSON json = this.get(key); if(null == json){ - return set(key, 1); + return putObj(key, 1); } if(json instanceof JSONPrimitive){ @@ -185,11 +185,11 @@ public class JSONObject extends MapWrapper implements JSON, JSONGe public JSONObject append(final String key, final Object value) throws JSONException { final Object object = this.getObj(key); if (object == null) { - this.set(key, value); + this.putObj(key, value); } else if (object instanceof JSONArray) { - ((JSONArray) object).set(value); + ((JSONArray) object).addObj(value); } else { - this.set(key, factory.ofArray().set(object).set(value)); + this.putObj(key, factory.ofArray().addObj(object).addObj(value)); } return this; } @@ -205,8 +205,8 @@ public class JSONObject extends MapWrapper implements JSON, JSONGe * @param fields lambda,不能为空 * @return this */ - public JSONObject setFields(final SerSupplier... fields) { - Arrays.stream(fields).forEach(f -> set(LambdaUtil.getFieldName(f), f.get())); + public JSONObject putFields(final SerSupplier... fields) { + Arrays.stream(fields).forEach(f -> putObj(LambdaUtil.getFieldName(f), f.get())); return this; } @@ -217,10 +217,10 @@ public class JSONObject extends MapWrapper implements JSON, JSONGe * @return this. * @throws JSONException 值是无穷数字抛出此异常 */ - public JSONObject setAll(final Map map) { + public JSONObject putAllObj(final Map map) { if(MapUtil.isNotEmpty(map)){ for (final Entry entry : map.entrySet()) { - this.set(StrUtil.toStringOrNull(entry.getKey()), entry.getValue()); + this.putObj(StrUtil.toStringOrNull(entry.getKey()), entry.getValue()); } } return this; @@ -234,7 +234,7 @@ public class JSONObject extends MapWrapper implements JSON, JSONGe * @return this. * @throws JSONException 值是无穷数字抛出此异常 */ - public JSONObject set(final String key, final Object value) throws JSONException { + public JSONObject putObj(final String key, final Object value) throws JSONException { this.put(key, factory.getMapper().map(value)); return this; } diff --git a/hutool-json/src/main/java/org/dromara/hutool/json/jwt/Claims.java b/hutool-json/src/main/java/org/dromara/hutool/json/jwt/Claims.java index 081f4e9fc..eb0b77c32 100644 --- a/hutool-json/src/main/java/org/dromara/hutool/json/jwt/Claims.java +++ b/hutool-json/src/main/java/org/dromara/hutool/json/jwt/Claims.java @@ -55,7 +55,7 @@ public class Claims implements Serializable { claimJSON.remove(name); return; } - claimJSON.set(name, value); + claimJSON.putObj(name, value); } /** diff --git a/hutool-json/src/main/java/org/dromara/hutool/json/reader/JSONParser.java b/hutool-json/src/main/java/org/dromara/hutool/json/reader/JSONParser.java index b014d2cc0..7999c58af 100644 --- a/hutool-json/src/main/java/org/dromara/hutool/json/reader/JSONParser.java +++ b/hutool-json/src/main/java/org/dromara/hutool/json/reader/JSONParser.java @@ -165,20 +165,8 @@ public class JSONParser { // The key is followed by ':'. tokener.nextColon(); - // 过滤并设置键值对 - final JSON value = nextJSON(tokener.nextClean()); - // 添加前置过滤,通过MutablePair实现过滤、修改键值对等 - final Predicate> predicate = factory.getPredicate(); - if (null != predicate) { - final MutableEntry entry = new MutableEntry<>(key, value); - if (predicate.test(entry)) { - // 使用修改后的键值对 - key = (String) entry.getKey(); - jsonObject.set(key, entry.getValue()); - } - } else { - jsonObject.set(key, value); - } + // 过滤并设置键值对,通过MutablePair实现过滤、修改键值对等 + set(jsonObject, key, nextJSON(tokener.nextClean())); // Pairs are separated by ',' or ';' switch (tokener.nextClean()) { @@ -199,6 +187,27 @@ public class JSONParser { } } + /** + * 设置键值对,通过前置过滤器过滤、修改键值对等 + * + * @param jsonObject JSON对象 + * @param key 键 + * @param value 值 + */ + private void set(final JSONObject jsonObject, final String key, final JSON value){ + // 添加前置过滤,通过MutablePair实现过滤、修改键值对等 + final Predicate> predicate = factory.getPredicate(); + if (null != predicate) { + final MutableEntry entry = new MutableEntry<>(key, value); + if (predicate.test(entry)) { + // 使用修改后的键值对 + jsonObject.putObj((String) entry.getKey(), entry.getValue()); + } + } else { + jsonObject.put(key, value); + } + } + /** * 解析下一个值为JSONArray,第一个字符必须读取完后再调用此方法 * @@ -214,23 +223,31 @@ public class JSONParser { return; } else { // ,value or value - JSON value = nextJSON(CharUtil.COMMA == c ? tokener.nextClean() : c); - final Predicate> predicate = factory.getPredicate(); - if (null != predicate) { - // 使用过滤器 - final MutableEntry entry = MutableEntry.of(jsonArray.size(), value); - if (predicate.test(entry)) { - // 使用修改后的键值对 - value = (JSON) entry.getValue(); - jsonArray.add(value); - } - } else { - jsonArray.add(value); - } + set(jsonArray, nextJSON(CharUtil.COMMA == c ? tokener.nextClean() : c)); } } } + /** + * 设置数组元素,通过前置过滤器过滤、修改键值对等 + * + * @param jsonArray JSON数组 + * @param value 值 + */ + private void set(final JSONArray jsonArray, final JSON value) { + final Predicate> predicate = factory.getPredicate(); + if (null != predicate) { + // 使用过滤器 + final MutableEntry entry = MutableEntry.of(jsonArray.size(), value); + if (predicate.test(entry)) { + // 使用修改后的键值对,用户修改后可能不是JSON,此处使用set,调用mapper转换 + jsonArray.setObj((Integer) entry.getKey(), entry.getValue()); + } + } else { + jsonArray.add(value); + } + } + /** * 解析为JSONPrimitive或{@code null},解析值包括: *
diff --git a/hutool-json/src/main/java/org/dromara/hutool/json/serializer/JSONMapper.java b/hutool-json/src/main/java/org/dromara/hutool/json/serializer/JSONMapper.java
index 17f6a49ca..44cbc980f 100644
--- a/hutool-json/src/main/java/org/dromara/hutool/json/serializer/JSONMapper.java
+++ b/hutool-json/src/main/java/org/dromara/hutool/json/serializer/JSONMapper.java
@@ -147,7 +147,7 @@ public class JSONMapper implements Serializable {
 	public JSONArray mapFromJSONObject(final JSONObject jsonObject) {
 		final JSONArray array = factory.ofArray();
 		for (final Map.Entry entry : jsonObject) {
-			array.set(entry);
+			array.addObj(entry);
 		}
 		return array;
 	}
diff --git a/hutool-json/src/main/java/org/dromara/hutool/json/serializer/impl/ArrayTypeAdapter.java b/hutool-json/src/main/java/org/dromara/hutool/json/serializer/impl/ArrayTypeAdapter.java
index dd7c9afe5..a3f0e9515 100644
--- a/hutool-json/src/main/java/org/dromara/hutool/json/serializer/impl/ArrayTypeAdapter.java
+++ b/hutool-json/src/main/java/org/dromara/hutool/json/serializer/impl/ArrayTypeAdapter.java
@@ -109,7 +109,7 @@ public class ArrayTypeAdapter implements MatcherJSONSerializer, MatcherJ
 		// 非标准的二进制流,则按照普通数组对待
 		final JSONArray result = context.getOrCreateArray();
 		for (final byte b : bytes) {
-			result.set(b);
+			result.addObj(b);
 		}
 		return result;
 	}
diff --git a/hutool-json/src/main/java/org/dromara/hutool/json/serializer/impl/BeanTypeAdapter.java b/hutool-json/src/main/java/org/dromara/hutool/json/serializer/impl/BeanTypeAdapter.java
index 92f879940..74e1c417f 100644
--- a/hutool-json/src/main/java/org/dromara/hutool/json/serializer/impl/BeanTypeAdapter.java
+++ b/hutool-json/src/main/java/org/dromara/hutool/json/serializer/impl/BeanTypeAdapter.java
@@ -18,7 +18,6 @@ package org.dromara.hutool.json.serializer.impl;
 
 import org.dromara.hutool.core.bean.BeanDesc;
 import org.dromara.hutool.core.bean.BeanUtil;
-import org.dromara.hutool.core.bean.copier.BeanToMapCopier;
 import org.dromara.hutool.core.bean.copier.ValueProviderToBeanCopier;
 import org.dromara.hutool.core.lang.copier.Copier;
 import org.dromara.hutool.core.reflect.ConstructorUtil;
@@ -31,6 +30,7 @@ import org.dromara.hutool.json.JSONObject;
 import org.dromara.hutool.json.serializer.JSONContext;
 import org.dromara.hutool.json.serializer.MatcherJSONDeserializer;
 import org.dromara.hutool.json.serializer.MatcherJSONSerializer;
+import org.dromara.hutool.json.support.BeanToJSONCopier;
 import org.dromara.hutool.json.support.JSONObjectValueProvider;
 
 import java.lang.reflect.Type;
@@ -72,14 +72,9 @@ public class BeanTypeAdapter implements MatcherJSONSerializer, MatcherJS
 
 	@Override
 	public JSON serialize(final Object bean, final JSONContext context) {
-		final JSONObject contextJson = context.getOrCreateObj();
-
-		final BeanToMapCopier copier = new BeanToMapCopier(
-			bean,
-			contextJson,
-			JSONObject.class, InternalJSONUtil.toCopyOptions(context.config())
-		);
-		return (JSON) copier.copy();
+		final BeanToJSONCopier copier = new BeanToJSONCopier(
+			bean, context.getOrCreateObj(), context.getFactory());
+		return copier.copy();
 	}
 
 	@Override
diff --git a/hutool-json/src/main/java/org/dromara/hutool/json/serializer/impl/EntryTypeAdapter.java b/hutool-json/src/main/java/org/dromara/hutool/json/serializer/impl/EntryTypeAdapter.java
index 3756dc314..04f938bd8 100644
--- a/hutool-json/src/main/java/org/dromara/hutool/json/serializer/impl/EntryTypeAdapter.java
+++ b/hutool-json/src/main/java/org/dromara/hutool/json/serializer/impl/EntryTypeAdapter.java
@@ -59,7 +59,7 @@ public class EntryTypeAdapter implements MatcherJSONSerializer>,
 	@Override
 	public JSON serialize(final Map.Entry bean, final JSONContext context) {
 		return context.getOrCreateObj()
-			.set(ConvertUtil.toStr(bean.getKey()), bean.getValue());
+			.putObj(ConvertUtil.toStr(bean.getKey()), bean.getValue());
 	}
 
 	@Override
diff --git a/hutool-json/src/main/java/org/dromara/hutool/json/serializer/impl/IterTypeAdapter.java b/hutool-json/src/main/java/org/dromara/hutool/json/serializer/impl/IterTypeAdapter.java
index be0097b80..45c427b1c 100644
--- a/hutool-json/src/main/java/org/dromara/hutool/json/serializer/impl/IterTypeAdapter.java
+++ b/hutool-json/src/main/java/org/dromara/hutool/json/serializer/impl/IterTypeAdapter.java
@@ -113,7 +113,7 @@ public class IterTypeAdapter implements MatcherJSONSerializer, MatcherJS
 			next = iter.next();
 			// 检查循环引用
 			if (next != source) {
-				jsonArray.set(next);
+				jsonArray.addObj(next);
 			}
 		}
 	}
diff --git a/hutool-json/src/main/java/org/dromara/hutool/json/serializer/impl/MapTypeAdapter.java b/hutool-json/src/main/java/org/dromara/hutool/json/serializer/impl/MapTypeAdapter.java
index 92fb36e54..0179b2b90 100644
--- a/hutool-json/src/main/java/org/dromara/hutool/json/serializer/impl/MapTypeAdapter.java
+++ b/hutool-json/src/main/java/org/dromara/hutool/json/serializer/impl/MapTypeAdapter.java
@@ -63,7 +63,7 @@ public class MapTypeAdapter implements MatcherJSONSerializer>, Matcher
 		final JSONObject result = context.getOrCreateObj();
 		// 注入键值对
 		for (final Map.Entry e : bean.entrySet()) {
-			result.set(ConvertUtil.toStr(e.getKey()), e.getValue());
+			result.putObj(ConvertUtil.toStr(e.getKey()), e.getValue());
 		}
 		return result;
 	}
diff --git a/hutool-json/src/main/java/org/dromara/hutool/json/serializer/impl/ResourceBundleSerializer.java b/hutool-json/src/main/java/org/dromara/hutool/json/serializer/impl/ResourceBundleSerializer.java
index 96799071d..856333227 100644
--- a/hutool-json/src/main/java/org/dromara/hutool/json/serializer/impl/ResourceBundleSerializer.java
+++ b/hutool-json/src/main/java/org/dromara/hutool/json/serializer/impl/ResourceBundleSerializer.java
@@ -87,10 +87,10 @@ public class ResourceBundleSerializer implements MatcherJSONSerializer {
+
+	private final Object source;
+	private final JSONObject target;
+	private final JSONFactory factory;
+
+	/**
+	 * 构造
+	 *
+	 * @param source  源对象
+	 * @param target  目标JSON
+	 * @param factory JSON工厂
+	 */
+	public BeanToJSONCopier(final Object source, final JSONObject target, final JSONFactory factory) {
+		this.source = source;
+		this.target = target;
+		this.factory = factory;
+	}
+
+	@Override
+	public JSONObject copy() {
+		final JSONConfig config = factory.getConfig();
+		final Map sourcePropDescMap = BeanUtil.getBeanDesc(source.getClass())
+			.getPropMap(config.isIgnoreCase());
+
+		sourcePropDescMap.forEach((sFieldName, sDesc) -> {
+			if (null == sFieldName || !sDesc.isReadable(config.isTransientSupport())) {
+				// 字段空或不可读,跳过
+				return;
+			}
+
+			final Object sValue = sDesc.getValue(this.source, config.isIgnoreError());
+			putValue(sFieldName, sValue, config.isIgnoreNullValue());
+		});
+
+		return target;
+	}
+
+	/**
+	 * 赋值,过滤则跳过
+	 *
+	 * @param fieldName       字段名
+	 * @param sValue          源值
+	 * @param ignoreNullValue 是否忽略null值
+	 */
+	private void putValue(final String fieldName, final Object sValue, final boolean ignoreNullValue) {
+		final Predicate> predicate = factory.getPredicate();
+		if (null != predicate) {
+			final MutableEntry entry = new MutableEntry<>(fieldName, sValue);
+			if (predicate.test(entry)) {
+				// 使用修改后的键值对
+				target.putObj((String) entry.getKey(), entry.getValue());
+			}
+		} else if (null != sValue || !ignoreNullValue) {
+			target.putObj(fieldName, sValue);
+		}
+	}
+}
diff --git a/hutool-json/src/main/java/org/dromara/hutool/json/support/JSONNodeBeanFactory.java b/hutool-json/src/main/java/org/dromara/hutool/json/support/JSONNodeBeanFactory.java
index f9641f47a..8057b6558 100644
--- a/hutool-json/src/main/java/org/dromara/hutool/json/support/JSONNodeBeanFactory.java
+++ b/hutool-json/src/main/java/org/dromara/hutool/json/support/JSONNodeBeanFactory.java
@@ -82,9 +82,9 @@ public class JSONNodeBeanFactory implements NodeBeanFactory {
 			return bean;
 		} else if (node instanceof NameNode) {
 			if(bean instanceof JSONObject){
-				((JSONObject) bean).set(((NameNode) node).getName(), value);
+				((JSONObject) bean).putObj(((NameNode) node).getName(), value);
 			} else if(bean instanceof JSONArray){
-				((JSONArray) bean).setValue(Integer.parseInt(((NameNode) node).getName()), value);
+				((JSONArray) bean).setObj(Integer.parseInt(((NameNode) node).getName()), value);
 			}
 			return bean;
 		}
diff --git a/hutool-json/src/test/java/org/dromara/hutool/json/CustomSerializeTest.java b/hutool-json/src/test/java/org/dromara/hutool/json/CustomSerializeTest.java
index def5aecad..7e7f20813 100644
--- a/hutool-json/src/test/java/org/dromara/hutool/json/CustomSerializeTest.java
+++ b/hutool-json/src/test/java/org/dromara/hutool/json/CustomSerializeTest.java
@@ -33,7 +33,7 @@ public class CustomSerializeTest {
 		TypeAdapterManager.getInstance().register(CustomBean.class,
 			(JSONSerializer) (bean, context) ->{
 				final JSONObject contextJson = context.getOrCreateObj();
-				return contextJson.set("customName", bean.name);
+				return contextJson.putObj("customName", bean.name);
 			});
 	}
 
@@ -51,7 +51,7 @@ public class CustomSerializeTest {
 		final CustomBean customBean = new CustomBean();
 		customBean.name = "testName";
 
-		final JSONObject obj = JSONUtil.ofObj().set("customBean", customBean);
+		final JSONObject obj = JSONUtil.ofObj().putObj("customBean", customBean);
 		Assertions.assertEquals("testName", obj.getJSONObject("customBean").getStr("customName"));
 	}
 
diff --git a/hutool-json/src/test/java/org/dromara/hutool/json/Issue1399Test.java b/hutool-json/src/test/java/org/dromara/hutool/json/Issue1399Test.java
index 4856fe2bd..31445c208 100644
--- a/hutool-json/src/test/java/org/dromara/hutool/json/Issue1399Test.java
+++ b/hutool-json/src/test/java/org/dromara/hutool/json/Issue1399Test.java
@@ -29,7 +29,7 @@ import java.sql.SQLException;
 public class Issue1399Test {
 	@Test
 	void sqlExceptionTest() {
-		final JSONObject set = JSONUtil.ofObj().set("error", new SQLException("test"));
+		final JSONObject set = JSONUtil.ofObj().putObj("error", new SQLException("test"));
 
 		final String jsonStr = set.toString();
 		Assertions.assertEquals("{\"error\":\"java.sql.SQLException: test\"}", jsonStr);
diff --git a/hutool-json/src/test/java/org/dromara/hutool/json/Issue2090Test.java b/hutool-json/src/test/java/org/dromara/hutool/json/Issue2090Test.java
index 788e84a83..78ab7821d 100644
--- a/hutool-json/src/test/java/org/dromara/hutool/json/Issue2090Test.java
+++ b/hutool-json/src/test/java/org/dromara/hutool/json/Issue2090Test.java
@@ -71,7 +71,7 @@ public class Issue2090Test {
 	@Test
 	public void monthTest(){
 		final JSONObject jsonObject = new JSONObject();
-		jsonObject.set("month", Month.JANUARY);
+		jsonObject.putObj("month", Month.JANUARY);
 		Assertions.assertEquals("{\"month\":1}", jsonObject.toString());
 
 		final JSON parse = JSONUtil.parse(Month.JANUARY);
@@ -83,7 +83,7 @@ public class Issue2090Test {
 	@Test
 	public void weekTest(){
 		final JSONObject jsonObject = new JSONObject();
-		jsonObject.set("week", DayOfWeek.SUNDAY);
+		jsonObject.putObj("week", DayOfWeek.SUNDAY);
 		Assertions.assertEquals("{\"week\":7}", jsonObject.toString());
 
 		final JSON parse = JSONUtil.parse(DayOfWeek.SUNDAY);
diff --git a/hutool-json/src/test/java/org/dromara/hutool/json/Issue2555Test.java b/hutool-json/src/test/java/org/dromara/hutool/json/Issue2555Test.java
index f8bf285f6..b6aa06657 100644
--- a/hutool-json/src/test/java/org/dromara/hutool/json/Issue2555Test.java
+++ b/hutool-json/src/test/java/org/dromara/hutool/json/Issue2555Test.java
@@ -57,7 +57,7 @@ public class Issue2555Test {
 	public static class MySerializer implements JSONSerializer {
 		@Override
 		public JSON serialize(final MyType bean, final JSONContext context) {
-			return context.getOrCreateObj().set("addr", bean.getAddress());
+			return context.getOrCreateObj().putObj("addr", bean.getAddress());
 		}
 	}
 
diff --git a/hutool-json/src/test/java/org/dromara/hutool/json/Issue2572Test.java b/hutool-json/src/test/java/org/dromara/hutool/json/Issue2572Test.java
index 72aa982cf..627e9ce54 100644
--- a/hutool-json/src/test/java/org/dromara/hutool/json/Issue2572Test.java
+++ b/hutool-json/src/test/java/org/dromara/hutool/json/Issue2572Test.java
@@ -33,7 +33,7 @@ public class Issue2572Test {
 		final Set weeks = new HashSet<>();
 		weeks.add(DayOfWeek.MONDAY);
 		final JSONObject obj = new JSONObject();
-		obj.set("weeks", weeks);
+		obj.putObj("weeks", weeks);
 		Assertions.assertEquals("{\"weeks\":[1]}", obj.toString());
 
 		final Map> monthDays1 = obj.toBean(new TypeReference>>() {
@@ -46,7 +46,7 @@ public class Issue2572Test {
 		final Set months = new HashSet<>();
 		months.add(Month.DECEMBER);
 		final JSONObject obj = new JSONObject();
-		obj.set("months", months);
+		obj.putObj("months", months);
 		Assertions.assertEquals("{\"months\":[12]}", obj.toString());
 
 		final Map> monthDays1 = obj.toBean(new TypeReference>>() {
@@ -59,7 +59,7 @@ public class Issue2572Test {
 		final Set monthDays = new HashSet<>();
 		monthDays.add(MonthDay.of(Month.DECEMBER, 1));
 		final JSONObject obj = new JSONObject();
-		obj.set("monthDays", monthDays);
+		obj.putObj("monthDays", monthDays);
 		Assertions.assertEquals("{\"monthDays\":[\"--12-01\"]}", obj.toString());
 
 		final Map> monthDays1 = obj.toBean(new TypeReference>>() {
diff --git a/hutool-json/src/test/java/org/dromara/hutool/json/Issue3086Test.java b/hutool-json/src/test/java/org/dromara/hutool/json/Issue3086Test.java
index 23eba9edd..cc61f6253 100644
--- a/hutool-json/src/test/java/org/dromara/hutool/json/Issue3086Test.java
+++ b/hutool-json/src/test/java/org/dromara/hutool/json/Issue3086Test.java
@@ -70,7 +70,7 @@ public class Issue3086Test {
 		public JSON serialize(final TestBean bean, final JSONContext context) {
 			final List strings = bean.getAuthorities()
 				.stream().map(SimpleGrantedAuthority::getAuthority).collect(Collectors.toList());
-			return context.getOrCreateObj().set("authorities",strings);
+			return context.getOrCreateObj().putObj("authorities",strings);
 		}
 	}
 }
diff --git a/hutool-json/src/test/java/org/dromara/hutool/json/IssueI3EGJPTest.java b/hutool-json/src/test/java/org/dromara/hutool/json/IssueI3EGJPTest.java
index c48a575c3..65ff08e41 100644
--- a/hutool-json/src/test/java/org/dromara/hutool/json/IssueI3EGJPTest.java
+++ b/hutool-json/src/test/java/org/dromara/hutool/json/IssueI3EGJPTest.java
@@ -25,8 +25,8 @@ public class IssueI3EGJPTest {
 	@Test
 	public void hutoolMapToBean() {
 		final JSONObject paramJson = new JSONObject();
-		paramJson.set("is_booleana", "1");
-		paramJson.set("is_booleanb", true);
+		paramJson.putObj("is_booleana", "1");
+		paramJson.putObj("is_booleanb", true);
 		final ConvertDO convertDO = paramJson.toBean(ConvertDO.class);
 
 		Assertions.assertTrue(convertDO.isBooleana());
diff --git a/hutool-json/src/test/java/org/dromara/hutool/json/IssueI59LW4Test.java b/hutool-json/src/test/java/org/dromara/hutool/json/IssueI59LW4Test.java
index f9070f88b..10c11e8dd 100644
--- a/hutool-json/src/test/java/org/dromara/hutool/json/IssueI59LW4Test.java
+++ b/hutool-json/src/test/java/org/dromara/hutool/json/IssueI59LW4Test.java
@@ -22,7 +22,7 @@ import org.junit.jupiter.api.Test;
 public class IssueI59LW4Test {
 	@Test
 	public void bytesTest(){
-		final JSONObject jsonObject = JSONUtil.ofObj().set("bytes", new byte[]{1});
+		final JSONObject jsonObject = JSONUtil.ofObj().putObj("bytes", new byte[]{1});
 		Assertions.assertEquals("{\"bytes\":[1]}", jsonObject.toString());
 
 		final byte[] bytes = jsonObject.getBytes("bytes");
@@ -31,7 +31,7 @@ public class IssueI59LW4Test {
 
 	@Test
 	public void bytesInJSONArrayTest(){
-		final JSONArray jsonArray = JSONUtil.ofArray().set(new byte[]{1});
+		final JSONArray jsonArray = JSONUtil.ofArray().addObj(new byte[]{1});
 		Assertions.assertEquals("[[1]]", jsonArray.toString());
 
 		final byte[] bytes = jsonArray.getBytes(0);
diff --git a/hutool-json/src/test/java/org/dromara/hutool/json/IssueI7VM64Test.java b/hutool-json/src/test/java/org/dromara/hutool/json/IssueI7VM64Test.java
index 0b532cfa0..eb103bbd2 100644
--- a/hutool-json/src/test/java/org/dromara/hutool/json/IssueI7VM64Test.java
+++ b/hutool-json/src/test/java/org/dromara/hutool/json/IssueI7VM64Test.java
@@ -34,7 +34,7 @@ public class IssueI7VM64Test {
 		map.put("a", "1");
 
 		final JSONObject jsonObject = new JSONObject();
-		jsonObject.set("c", map);
+		jsonObject.putObj("c", map);
 		map.put("b", 2);
 
 		//Console.log("Hutool JSON: " + jsonObject);
diff --git a/hutool-json/src/test/java/org/dromara/hutool/json/JSONArrayTest.java b/hutool-json/src/test/java/org/dromara/hutool/json/JSONArrayTest.java
index b0003c4e1..afb957075 100644
--- a/hutool-json/src/test/java/org/dromara/hutool/json/JSONArrayTest.java
+++ b/hutool-json/src/test/java/org/dromara/hutool/json/JSONArrayTest.java
@@ -51,7 +51,7 @@ public class JSONArrayTest {
 		JSONArray jsonArray = JSONUtil.parseArray(jsonObject, JSONConfig.of());
 		assertEquals(new JSONArray(), jsonArray);
 
-		jsonObject.set("key1", "value1");
+		jsonObject.putObj("key1", "value1");
 		jsonArray = JSONUtil.parseArray(jsonObject, JSONConfig.of());
 		assertEquals(1, jsonArray.size());
 		assertEquals("[{\"key1\":\"value1\"}]", jsonArray.toString());
@@ -70,9 +70,9 @@ public class JSONArrayTest {
 		final JSONArray array = JSONUtil.ofArray();
 		// 方法2
 		// JSONArray array = new JSONArray();
-		array.set("value1");
-		array.set("value2");
-		array.set("value3");
+		array.addObj("value1");
+		array.addObj("value2");
+		array.addObj("value3");
 
 		assertEquals(array.getObj(0), "value1");
 	}
@@ -240,12 +240,12 @@ public class JSONArrayTest {
 	@Test
 	public void putToIndexTest() {
 		JSONArray jsonArray = new JSONArray();
-		jsonArray.setValue(3, "test");
+		jsonArray.setObj(3, "test");
 		// 默认忽略null值,因此空位无值,只有一个值
 		assertEquals(1, jsonArray.size());
 
 		jsonArray = new JSONArray(JSONConfig.of().setIgnoreNullValue(false));
-		jsonArray.setValue(2, "test");
+		jsonArray.setObj(2, "test");
 		// 第三个位置插入值,0~2都是null
 		assertEquals(3, jsonArray.size());
 	}
@@ -254,7 +254,7 @@ public class JSONArrayTest {
 	@Test
 	public void putTest2() {
 		final JSONArray jsonArray = new JSONArray();
-		jsonArray.setValue(0, 1);
+		jsonArray.setObj(0, 1);
 		assertEquals(1, jsonArray.size());
 		assertEquals(1, jsonArray.getObj(0));
 	}
@@ -276,10 +276,10 @@ public class JSONArrayTest {
 	@Test
 	public void filterIncludeTest() {
 		final JSONArray json1 = JSONUtil.ofArray()
-				.set("value1")
-				.set("value2")
-				.set("value3")
-				.set(true);
+				.addObj("value1")
+				.addObj("value2")
+				.addObj("value3")
+				.addObj(true);
 
 		final String s = json1.toJSONString(0, (pair) -> ((JSONPrimitive)pair.getValue()).getValue().equals("value2"));
 		assertEquals("[\"value2\"]", s);
@@ -288,10 +288,10 @@ public class JSONArrayTest {
 	@Test
 	public void filterExcludeTest() {
 		final JSONArray json1 = JSONUtil.ofArray()
-				.set("value1")
-				.set("value2")
-				.set("value3")
-				.set(true);
+				.addObj("value1")
+				.addObj("value2")
+				.addObj("value3")
+				.addObj(true);
 
 		final String s = json1.toJSONString(0, (pair) -> !((JSONPrimitive)pair.getValue()).getValue().equals("value2"));
 		assertEquals("[\"value1\",\"value3\",true]", s);
@@ -300,7 +300,7 @@ public class JSONArrayTest {
 	@Test
 	public void putNullTest() {
 		final JSONArray array = JSONUtil.ofArray(JSONConfig.of().setIgnoreNullValue(false));
-		array.set(null);
+		array.addObj(null);
 
 		assertEquals("[null]", array.toString());
 	}
@@ -322,7 +322,7 @@ public class JSONArrayTest {
 			if(mutable.getKey() instanceof Integer){
 				final JSONObject o = (JSONObject) mutable.getValue();
 				if ("111".equals(o.getStr("id"))) {
-					o.set("name", "test1_edit");
+					o.putObj("name", "test1_edit");
 				}
 			}
 			return true;
@@ -335,9 +335,9 @@ public class JSONArrayTest {
 	@Test
 	void jsonIterTest() {
 		final JSONArray array = JSONUtil.ofArray();
-		array.add(JSONUtil.ofObj().set("name", "aaa"));
-		array.add(JSONUtil.ofObj().set("name", "bbb"));
-		array.add(JSONUtil.ofObj().set("name", "ccc"));
+		array.add(JSONUtil.ofObj().putObj("name", "aaa"));
+		array.add(JSONUtil.ofObj().putObj("name", "bbb"));
+		array.add(JSONUtil.ofObj().putObj("name", "ccc"));
 
 		final StringBuilder result = new StringBuilder();
 		array.forEach(result::append);
diff --git a/hutool-json/src/test/java/org/dromara/hutool/json/JSONNullTest.java b/hutool-json/src/test/java/org/dromara/hutool/json/JSONNullTest.java
index 40b6014ba..d43aecb49 100644
--- a/hutool-json/src/test/java/org/dromara/hutool/json/JSONNullTest.java
+++ b/hutool-json/src/test/java/org/dromara/hutool/json/JSONNullTest.java
@@ -51,22 +51,22 @@ public class JSONNullTest {
 	@Test
 	public void setNullTest(){
 		// 忽略null
-		String json1 = JSONUtil.ofObj().set("key1", null).toString();
+		String json1 = JSONUtil.ofObj().putObj("key1", null).toString();
 		Assertions.assertEquals("{}", json1);
 
 		// 不忽略null
-		json1 = JSONUtil.ofObj(JSONConfig.of().setIgnoreNullValue(false)).set("key1", null).toString();
+		json1 = JSONUtil.ofObj(JSONConfig.of().setIgnoreNullValue(false)).putObj("key1", null).toString();
 		Assertions.assertEquals("{\"key1\":null}", json1);
 	}
 
 	@Test
 	public void setNullOfJSONArrayTest(){
 		// 忽略null
-		String json1 = JSONUtil.ofArray().set(null).toString();
+		String json1 = JSONUtil.ofArray().addObj(null).toString();
 		Assertions.assertEquals("[]", json1);
 
 		// 不忽略null
-		json1 = JSONUtil.ofArray(JSONConfig.of().setIgnoreNullValue(false)).set(null).toString();
+		json1 = JSONUtil.ofArray(JSONConfig.of().setIgnoreNullValue(false)).addObj(null).toString();
 		Assertions.assertEquals("[null]", json1);
 	}
 }
diff --git a/hutool-json/src/test/java/org/dromara/hutool/json/JSONObjectTest.java b/hutool-json/src/test/java/org/dromara/hutool/json/JSONObjectTest.java
index 24a726713..3cf05b687 100644
--- a/hutool-json/src/test/java/org/dromara/hutool/json/JSONObjectTest.java
+++ b/hutool-json/src/test/java/org/dromara/hutool/json/JSONObjectTest.java
@@ -75,18 +75,18 @@ public class JSONObjectTest {
 	@Test
 	public void toStringTest3() {
 		final JSONObject json = JSONUtil.ofObj(JSONConfig.of().setDateFormat(DatePattern.NORM_DATE_PATTERN))//
-						.set("dateTime", DateUtil.parse("2019-05-02 22:12:01"));
+						.putObj("dateTime", DateUtil.parse("2019-05-02 22:12:01"));
 		assertEquals("{\"dateTime\":\"2019-05-02\"}", json.toString());
 	}
 
 	@Test
 	public void toStringWithDateTest() {
-		JSONObject json = JSONUtil.ofObj().set("date", DateUtil.parse("2019-05-08 19:18:21"));
+		JSONObject json = JSONUtil.ofObj().putObj("date", DateUtil.parse("2019-05-08 19:18:21"));
 		assert json != null;
 		assertEquals("{\"date\":1557314301000}", json.toString());
 
 		json = JSONUtil.ofObj(JSONConfig.of().setDateFormat(DatePattern.NORM_DATE_PATTERN))
-			.set("date", DateUtil.parse("2019-05-08 19:18:21"));
+			.putObj("date", DateUtil.parse("2019-05-08 19:18:21"));
 		assertEquals("{\"date\":\"2019-05-08\"}", json.toString());
 	}
 
@@ -94,14 +94,14 @@ public class JSONObjectTest {
 	@Test
 	public void putAllTest() {
 		final JSONObject json1 = JSONUtil.ofObj()
-				.set("a", "value1")
-				.set("b", "value2")
-				.set("c", "value3")
-				.set("d", true);
+				.putObj("a", "value1")
+				.putObj("b", "value2")
+				.putObj("c", "value3")
+				.putObj("d", true);
 
 		final JSONObject json2 = JSONUtil.ofObj()
-				.set("a", "value21")
-				.set("b", "value22");
+				.putObj("a", "value21")
+				.putObj("b", "value22");
 
 		// putAll操作会覆盖相同key的值,因此a,b两个key的值改变,c的值不变
 		json1.putAll(json2);
@@ -193,12 +193,12 @@ public class JSONObjectTest {
 
 	@Test
 	public void toBeanTest() {
-		final JSONObject subJson = JSONUtil.ofObj().set("value1", "strValue1").set("value2", "234");
-		final JSONObject json = JSONUtil.ofObj(JSONConfig.of().setIgnoreError(true)).set("strValue", "strTest").set("intValue", 123)
+		final JSONObject subJson = JSONUtil.ofObj().putObj("value1", "strValue1").putObj("value2", "234");
+		final JSONObject json = JSONUtil.ofObj(JSONConfig.of().setIgnoreError(true)).putObj("strValue", "strTest").putObj("intValue", 123)
 				// 测试空字符串转对象
-				.set("doubleValue", "")
-				.set("beanValue", subJson)
-				.set("list", JSONUtil.ofArray().set("a").set("b")).set("testEnum", "TYPE_A");
+				.putObj("doubleValue", "")
+				.putObj("beanValue", subJson)
+				.putObj("list", JSONUtil.ofArray().addObj("a").addObj("b")).putObj("testEnum", "TYPE_A");
 
 		final TestBean bean = json.toBean(TestBean.class);
 		assertEquals("a", bean.getList().get(0));
@@ -214,11 +214,11 @@ public class JSONObjectTest {
 	@Test
 	public void toBeanNullStrTest() {
 		final JSONObject json = JSONUtil.ofObj(JSONConfig.of().setIgnoreError(true))//
-				.set("strValue", "null")//
-				.set("intValue", 123)//
+				.putObj("strValue", "null")//
+				.putObj("intValue", 123)//
 				// 子对象对应"null"字符串,如果忽略错误,跳过,否则抛出转换异常
-				.set("beanValue", "null")//
-				.set("list", JSONUtil.ofArray().set("a").set("b"));
+				.putObj("beanValue", "null")//
+				.putObj("list", JSONUtil.ofArray().addObj("a").addObj("b"));
 
 		final TestBean bean = json.toBean(TestBean.class);
 		// 当JSON中为字符串"null"时应被当作字符串处理
@@ -230,7 +230,7 @@ public class JSONObjectTest {
 	@Test
 	void addListTest(){
 		final JSONObject json = JSONUtil.ofObj();
-		json.set("list", ListUtil.of(1, 2, 3));
+		json.putObj("list", ListUtil.of(1, 2, 3));
 		Assertions.assertEquals("{\"list\":[1,2,3]}", json.toString());
 	}
 
@@ -288,11 +288,11 @@ public class JSONObjectTest {
 	@Test
 	public void toBeanTest6() {
 		final JSONObject json = JSONUtil.ofObj()
-				.set("targetUrl", "http://test.com")
-				.set("success", "true")
-				.set("result", JSONUtil.ofObj()
-						.set("token", "tokenTest")
-						.set("userId", "测试用户1"));
+				.putObj("targetUrl", "http://test.com")
+				.putObj("success", "true")
+				.putObj("result", JSONUtil.ofObj()
+						.putObj("token", "tokenTest")
+						.putObj("userId", "测试用户1"));
 
 		final TokenAuthWarp2 bean = json.toBean(TokenAuthWarp2.class);
 		assertEquals("http://test.com", bean.getTargetUrl());
@@ -353,8 +353,8 @@ public class JSONObjectTest {
 	@Test
 	public void parseBeanTest3() {
 		final JSONObject json = JSONUtil.ofObj()
-				.set("code", 22)
-				.set("data", "{\"jobId\": \"abc\", \"videoUrl\": \"http://a.com/a.mp4\"}");
+				.putObj("code", 22)
+				.putObj("data", "{\"jobId\": \"abc\", \"videoUrl\": \"http://a.com/a.mp4\"}");
 
 		final JSONBean bean = json.toBean(JSONBean.class);
 		assertEquals(22, bean.getCode());
@@ -393,9 +393,9 @@ public class JSONObjectTest {
 	@Test
 	public void beanTransTest3() {
 		final JSONObject userAJson = JSONUtil.ofObj()
-				.set("a", "AValue")
-				.set("name", "nameValue")
-				.set("date", "08:00:00");
+				.putObj("a", "AValue")
+				.putObj("name", "nameValue")
+				.putObj("date", "08:00:00");
 		final UserA bean = JSONUtil.toBean(userAJson.toString(), UserA.class);
 		assertEquals(DateUtil.formatToday() + " 08:00:00", DateUtil.date(bean.getDate()).toString());
 	}
@@ -449,8 +449,8 @@ public class JSONObjectTest {
 		assertEquals(Integer.valueOf(35), jsonObject.getInt("age"));
 
 		final JSONObject json = JSONUtil.ofObj()
-				.set("name", "张三")
-				.set("age", 35);
+				.putObj("name", "张三")
+				.putObj("age", 35);
 		final BeanWithAlias bean = JSONUtil.toBean(Objects.requireNonNull(json).toString(), BeanWithAlias.class);
 		assertEquals("张三", bean.getValue1());
 		assertEquals(Integer.valueOf(35), bean.getValue2());
@@ -475,9 +475,9 @@ public class JSONObjectTest {
 
 		final Date date = DateUtil.parse("2020-06-05 11:16:11");
 		final JSONObject json = new JSONObject(jsonConfig);
-		json.set("date", date);
-		json.set("bbb", "222");
-		json.set("aaa", "123");
+		json.putObj("date", date);
+		json.putObj("bbb", "222");
+		json.putObj("aaa", "123");
 
 		final String jsonStr = "{\"date\":\"2020#06#05\",\"bbb\":\"222\",\"aaa\":\"123\"}";
 
@@ -495,7 +495,7 @@ public class JSONObjectTest {
 
 		final Date date = DateUtil.parse("2020-06-05 11:16:11");
 		final JSONObject json = new JSONObject(jsonConfig);
-		json.set("date", date);
+		json.putObj("date", date);
 
 		assertEquals("{\"date\":1591326971}", json.toString());
 
@@ -511,9 +511,9 @@ public class JSONObjectTest {
 
 		final Date date = DateUtil.parse("2020-06-05 11:16:11");
 		final JSONObject json = new JSONObject(jsonConfig);
-		json.set("date", date);
-		json.set("bbb", "222");
-		json.set("aaa", "123");
+		json.putObj("date", date);
+		json.putObj("bbb", "222");
+		json.putObj("aaa", "123");
 
 		final String jsonStr = "{\"date\":1591326971,\"bbb\":\"222\",\"aaa\":\"123\"}";
 
@@ -527,7 +527,7 @@ public class JSONObjectTest {
 	@Test
 	public void getTimestampTest() {
 		final String timeStr = "1970-01-01 00:00:00";
-		final JSONObject jsonObject = JSONUtil.ofObj().set("time", timeStr);
+		final JSONObject jsonObject = JSONUtil.ofObj().putObj("time", timeStr);
 		final Timestamp time = jsonObject.get("time", Timestamp.class);
 		assertEquals("1970-01-01 00:00:00.0", time.toString());
 	}
@@ -670,10 +670,10 @@ public class JSONObjectTest {
 	@Test
 	public void filterIncludeTest() {
 		final JSONObject json1 = JSONUtil.ofObj(JSONConfig.of())
-				.set("a", "value1")
-				.set("b", "value2")
-				.set("c", "value3")
-				.set("d", true);
+				.putObj("a", "value1")
+				.putObj("b", "value2")
+				.putObj("c", "value3")
+				.putObj("d", true);
 
 		final String s = json1.toJSONString(0, (pair) -> pair.getKey().equals("b"));
 		assertEquals("{\"b\":\"value2\"}", s);
@@ -682,10 +682,10 @@ public class JSONObjectTest {
 	@Test
 	public void filterExcludeTest() {
 		final JSONObject json1 = JSONUtil.ofObj(JSONConfig.of())
-				.set("a", "value1")
-				.set("b", "value2")
-				.set("c", "value3")
-				.set("d", true);
+				.putObj("a", "value1")
+				.putObj("b", "value2")
+				.putObj("c", "value3")
+				.putObj("d", true);
 
 		final String s = json1.toJSONString(0, (pair) -> !pair.getKey().equals("b"));
 		assertEquals("{\"a\":\"value1\",\"c\":\"value3\",\"d\":true}", s);
@@ -694,10 +694,10 @@ public class JSONObjectTest {
 	@Test
 	public void editTest() {
 		final JSONObject json1 = JSONUtil.ofObj(JSONConfig.of())
-				.set("a", "value1")
-				.set("b", "value2")
-				.set("c", "value3")
-				.set("d", true);
+				.putObj("a", "value1")
+				.putObj("b", "value2")
+				.putObj("c", "value3")
+				.putObj("d", true);
 
 		final String s = json1.toJSONString(0, (pair) -> {
 			if ("b".equals(pair.getKey())) {
@@ -715,10 +715,10 @@ public class JSONObjectTest {
 	@Test
 	public void toUnderLineCaseTest() {
 		final JSONObject json1 = JSONUtil.ofObj(JSONConfig.of())
-				.set("aKey", "value1")
-				.set("bJob", "value2")
-				.set("cGood", "value3")
-				.set("d", true);
+				.putObj("aKey", "value1")
+				.putObj("bJob", "value2")
+				.putObj("cGood", "value3")
+				.putObj("d", true);
 
 		final String s = json1.toJSONString(0, (pair) -> {
 			pair.setKey(StrUtil.toUnderlineCase((String)pair.getKey()));
@@ -730,8 +730,8 @@ public class JSONObjectTest {
 	@Test
 	public void nullToEmptyTest() {
 		final JSONObject json1 = JSONUtil.ofObj(JSONConfig.of().setIgnoreNullValue(false))
-				.set("a", null)
-				.set("b", "value2");
+				.putObj("a", null)
+				.putObj("b", "value2");
 
 		final String s = json1.toJSONString(0, (pair) -> {
 			pair.setValue(ObjUtil.defaultIfNull(pair.getValue(), StrUtil.EMPTY));
diff --git a/hutool-json/src/test/java/org/dromara/hutool/json/JSONUtilTest.java b/hutool-json/src/test/java/org/dromara/hutool/json/JSONUtilTest.java
index 89185908c..f2a7d4f20 100644
--- a/hutool-json/src/test/java/org/dromara/hutool/json/JSONUtilTest.java
+++ b/hutool-json/src/test/java/org/dromara/hutool/json/JSONUtilTest.java
@@ -186,9 +186,9 @@ public class JSONUtilTest {
 	public void toJsonStrTest3() {
 		// 验证某个字段为JSON字符串时转义是否规范
 		final JSONObject object = new JSONObject(JSONConfig.of().setIgnoreError(true));
-		object.set("name", "123123");
-		object.set("value", "\\");
-		object.set("value2", " map = MapUtil.newHashMap();
 		map.put("user", object.toString());
@@ -277,12 +277,12 @@ public class JSONUtilTest {
 	public void setStripTrailingZerosTest() {
 		// 默认去除多余的0
 		final JSONObject jsonObjectDefault = JSONUtil.ofObj()
-			.set("test2", 12.00D);
+			.putObj("test2", 12.00D);
 		assertEquals("{\"test2\":12}", jsonObjectDefault.toString());
 
 		// 不去除多余的0
 		final JSONObject jsonObject = JSONUtil.ofObj(JSONConfig.of().setStripTrailingZeros(false))
-			.set("test2", 12.00D);
+			.putObj("test2", 12.00D);
 		assertEquals("{\"test2\":12.0}", jsonObject.toString());
 
 		// 去除多余的0
@@ -304,7 +304,7 @@ public class JSONUtilTest {
 	public void sqlExceptionTest() {
 		//https://github.com/dromara/hutool/issues/1399
 		// SQLException实现了Iterable接口,默认是遍历之,会栈溢出,修正后只返回string
-		final JSONObject set = JSONUtil.ofObj().set("test", new SQLException("test"));
+		final JSONObject set = JSONUtil.ofObj().putObj("test", new SQLException("test"));
 		assertEquals("{\"test\":\"java.sql.SQLException: test\"}", set.toString());
 	}
 
@@ -318,8 +318,8 @@ public class JSONUtilTest {
 	@Test
 	public void toXmlTest() {
 		final JSONObject obj = JSONUtil.ofObj();
-		obj.set("key1", "v1")
-			.set("key2", ListUtil.view("a", "b", "c"));
+		obj.putObj("key1", "v1")
+			.putObj("key2", ListUtil.view("a", "b", "c"));
 		final String xmlStr = JSONUtil.toXmlStr(obj);
 		assertEquals("v1abc", xmlStr);
 	}
diff --git a/hutool-json/src/test/java/org/dromara/hutool/json/JSONWriterTest.java b/hutool-json/src/test/java/org/dromara/hutool/json/JSONWriterTest.java
index 6d2f51545..2a4d74982 100644
--- a/hutool-json/src/test/java/org/dromara/hutool/json/JSONWriterTest.java
+++ b/hutool-json/src/test/java/org/dromara/hutool/json/JSONWriterTest.java
@@ -27,7 +27,7 @@ public class JSONWriterTest {
 	@Test
 	public void writeDateTest() {
 		final JSONObject jsonObject = JSONUtil.ofObj(JSONConfig.of().setDateFormat("yyyy-MM-dd"))
-				.set("date", DateUtil.parse("2022-09-30"));
+				.putObj("date", DateUtil.parse("2022-09-30"));
 
 		// 日期原样写入
 		final Date date = jsonObject.getDate("date");
diff --git a/hutool-json/src/test/java/org/dromara/hutool/json/Pr3507Test.java b/hutool-json/src/test/java/org/dromara/hutool/json/Pr3507Test.java
index fbf5e7d29..1074a702c 100644
--- a/hutool-json/src/test/java/org/dromara/hutool/json/Pr3507Test.java
+++ b/hutool-json/src/test/java/org/dromara/hutool/json/Pr3507Test.java
@@ -22,7 +22,7 @@ import org.junit.jupiter.api.Test;
 public class Pr3507Test {
 	@Test
 	void writeClassTest() {
-		final JSONObject set = JSONUtil.ofObj().set("name", Pr3507Test.class);
+		final JSONObject set = JSONUtil.ofObj().putObj("name", Pr3507Test.class);
 		Assertions.assertEquals("{\"name\":\"org.dromara.hutool.json.Pr3507Test\"}", set.toString());
 	}
 }
diff --git a/hutool-json/src/test/java/org/dromara/hutool/json/xml/XMLTest.java b/hutool-json/src/test/java/org/dromara/hutool/json/xml/XMLTest.java
index 7e5de4d44..d20de9d60 100644
--- a/hutool-json/src/test/java/org/dromara/hutool/json/xml/XMLTest.java
+++ b/hutool-json/src/test/java/org/dromara/hutool/json/xml/XMLTest.java
@@ -26,8 +26,8 @@ public class XMLTest {
 	@Test
 	public void toXmlTest(){
 		final JSONObject put = JSONUtil.ofObj()
-				.set("aaa", "你好")
-				.set("键2", "test");
+				.putObj("aaa", "你好")
+				.putObj("键2", "test");
 		final String s = JSONUtil.toXmlStr(put);
 		Assertions.assertEquals("你好<键2>test", s);
 	}
@@ -45,7 +45,7 @@ public class XMLTest {
 
 	@Test
 	public void xmlContentTest(){
-		final JSONObject jsonObject = JSONUtil.ofObj().set("content","123456");
+		final JSONObject jsonObject = JSONUtil.ofObj().putObj("content","123456");
 
 		String xml = JSONXMLUtil.toXml(jsonObject);
 		Assertions.assertEquals("123456", xml);
@@ -56,7 +56,7 @@ public class XMLTest {
 
 	@Test
 	public void xmlContentTest2(){
-		final JSONObject jsonObject = JSONUtil.ofObj().set("content","123456");
+		final JSONObject jsonObject = JSONUtil.ofObj().putObj("content","123456");
 		final String xml = JSONXMLUtil.toXml(jsonObject, null, new String[0]);
 		Assertions.assertEquals("123456", xml);
 	}