diff --git a/hutool-json/src/main/java/org/dromara/hutool/json/mapper/package-info.java b/hutool-core/src/main/java/org/dromara/hutool/core/annotation/ReadableBean.java
similarity index 59%
rename from hutool-json/src/main/java/org/dromara/hutool/json/mapper/package-info.java
rename to hutool-core/src/main/java/org/dromara/hutool/core/annotation/ReadableBean.java
index 31138738a..5bef065fb 100644
--- a/hutool-json/src/main/java/org/dromara/hutool/json/mapper/package-info.java
+++ b/hutool-core/src/main/java/org/dromara/hutool/core/annotation/ReadableBean.java
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2013-2024 Hutool Team and hutool.cn
+ * Copyright (c) 2024 Hutool Team and hutool.cn
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
@@ -14,12 +14,19 @@
* limitations under the License.
*/
+package org.dromara.hutool.core.annotation;
+
+import java.lang.annotation.*;
+
/**
- * Bean和JSON之间的映射封装,包括:
- *
- *
JSONObjectMapper: 转换对象为JSONObject
- *
JSONArrayMapper: 转换对象为JSONArray
- *
JSONValueMapper: 转换对象为JSON值
- *
+ * 标记可读Bean
+ * 即包含有可读字段的Bean使用此注解标记,如含有public的字段或getter方法
+ *
+ * @author looly
+ * @since 6.0.0
*/
-package org.dromara.hutool.json.mapper;
+@Documented
+@Retention(RetentionPolicy.RUNTIME)
+@Target({ElementType.TYPE})
+public @interface ReadableBean {
+}
diff --git a/hutool-core/src/main/java/org/dromara/hutool/core/annotation/WritableBean.java b/hutool-core/src/main/java/org/dromara/hutool/core/annotation/WritableBean.java
new file mode 100644
index 000000000..e25cfa425
--- /dev/null
+++ b/hutool-core/src/main/java/org/dromara/hutool/core/annotation/WritableBean.java
@@ -0,0 +1,32 @@
+/*
+ * Copyright (c) 2024 Hutool Team and hutool.cn
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * 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 org.dromara.hutool.core.annotation;
+
+import java.lang.annotation.*;
+
+/**
+ * 标记可写Bean
+ * 即包含有可写字段的Bean使用此注解标记,如含有public的字段或setter方法
+ *
+ * @author looly
+ * @since 6.0.0
+ */
+@Documented
+@Retention(RetentionPolicy.RUNTIME)
+@Target({ElementType.TYPE})
+public @interface WritableBean {
+}
diff --git a/hutool-core/src/main/java/org/dromara/hutool/core/bean/BeanUtil.java b/hutool-core/src/main/java/org/dromara/hutool/core/bean/BeanUtil.java
index 0840bc112..266c8dc98 100644
--- a/hutool-core/src/main/java/org/dromara/hutool/core/bean/BeanUtil.java
+++ b/hutool-core/src/main/java/org/dromara/hutool/core/bean/BeanUtil.java
@@ -16,6 +16,9 @@
package org.dromara.hutool.core.bean;
+import org.dromara.hutool.core.annotation.AnnotationUtil;
+import org.dromara.hutool.core.annotation.ReadableBean;
+import org.dromara.hutool.core.annotation.WritableBean;
import org.dromara.hutool.core.array.ArrayUtil;
import org.dromara.hutool.core.bean.copier.BeanCopier;
import org.dromara.hutool.core.bean.copier.CopyOptions;
@@ -687,6 +690,11 @@ public class BeanUtil {
// String中有getter方法,但为字符串,不是Bean
return false;
}
+
+ if(AnnotationUtil.hasAnnotation(clazz, ReadableBean.class)){
+ return true;
+ }
+
return hasGetter(clazz) || hasPublicField(clazz);
}
@@ -712,6 +720,10 @@ public class BeanUtil {
return false;
}
+ if(AnnotationUtil.hasAnnotation(clazz, WritableBean.class)){
+ return true;
+ }
+
return hasSetter(clazz) || hasPublicField(clazz);
}
diff --git a/hutool-core/src/main/java/org/dromara/hutool/core/bean/copier/ValueProvider.java b/hutool-core/src/main/java/org/dromara/hutool/core/bean/copier/ValueProvider.java
index 6cedd7aab..a08fb95e5 100644
--- a/hutool-core/src/main/java/org/dromara/hutool/core/bean/copier/ValueProvider.java
+++ b/hutool-core/src/main/java/org/dromara/hutool/core/bean/copier/ValueProvider.java
@@ -31,7 +31,7 @@ public interface ValueProvider{
/**
* 获取值
- * 返回值一般需要匹配被注入类型,如果不匹配会调用默认转换 Convert#convert(Type, Object)实现转换
+ * 返回值一般需要匹配被注入类型,如果不匹配会调用默认转换 Convert#support(Type, Object)实现转换
*
* @param key Bean对象中参数名
* @param valueType 被注入的值的类型
diff --git a/hutool-core/src/main/java/org/dromara/hutool/core/bean/path/BeanPath.java b/hutool-core/src/main/java/org/dromara/hutool/core/bean/path/BeanPath.java
index 97bb1242a..16cfacce6 100644
--- a/hutool-core/src/main/java/org/dromara/hutool/core/bean/path/BeanPath.java
+++ b/hutool-core/src/main/java/org/dromara/hutool/core/bean/path/BeanPath.java
@@ -17,14 +17,11 @@
package org.dromara.hutool.core.bean.path;
import org.dromara.hutool.core.array.ArrayUtil;
-import org.dromara.hutool.core.bean.path.node.NameNode;
import org.dromara.hutool.core.bean.path.node.Node;
import org.dromara.hutool.core.bean.path.node.NodeFactory;
import org.dromara.hutool.core.text.CharUtil;
import org.dromara.hutool.core.text.StrUtil;
-import java.util.ArrayList;
-import java.util.HashMap;
import java.util.Iterator;
/**
@@ -67,6 +64,7 @@ public class BeanPath implements Iterator {
private final Node node;
private final String child;
+ private NodeBeanCreator beanCreator;
/**
* 构造
@@ -74,6 +72,7 @@ public class BeanPath implements Iterator {
* @param expression 表达式
*/
public BeanPath(final String expression) {
+ this.beanCreator = DefaultNodeBeanCreator.INSTANCE;
final int length = expression.length();
final StringBuilder builder = new StringBuilder();
@@ -128,6 +127,17 @@ public class BeanPath implements Iterator {
}
}
+ /**
+ * 设置Bean创建器,用于创建Bean对象,默认为{@link DefaultNodeBeanCreator}
+ *
+ * @param beanCreator Bean创建器
+ * @return this
+ */
+ public BeanPath setBeanCreator(final NodeBeanCreator beanCreator) {
+ this.beanCreator = beanCreator;
+ return this;
+ }
+
/**
* 获取节点
*
@@ -189,7 +199,7 @@ public class BeanPath implements Iterator {
final BeanPath childBeanPath = next();
Object subBean = this.node.getValue(bean);
if (null == subBean) {
- subBean = isListNode(childBeanPath.node) ? new ArrayList<>() : new HashMap<>();
+ subBean = beanCreator.create(bean, this);
this.node.setValue(bean, subBean);
// 如果自定义put方法修改了value,返回修改后的value,避免值丢失
subBean = this.node.getValue(bean);
@@ -210,17 +220,4 @@ public class BeanPath implements Iterator {
", child='" + child + '\'' +
'}';
}
-
- /**
- * 子节点值是否为列表
- *
- * @param node 节点
- * @return 是否为列表
- */
- private static boolean isListNode(final Node node) {
- if (node instanceof NameNode) {
- return ((NameNode) node).isNumber();
- }
- return false;
- }
}
diff --git a/hutool-core/src/main/java/org/dromara/hutool/core/bean/path/DefaultNodeBeanCreator.java b/hutool-core/src/main/java/org/dromara/hutool/core/bean/path/DefaultNodeBeanCreator.java
new file mode 100644
index 000000000..7640257a1
--- /dev/null
+++ b/hutool-core/src/main/java/org/dromara/hutool/core/bean/path/DefaultNodeBeanCreator.java
@@ -0,0 +1,69 @@
+/*
+ * Copyright (c) 2024 Hutool Team and hutool.cn
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * 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 org.dromara.hutool.core.bean.path;
+
+import org.dromara.hutool.core.array.ArrayUtil;
+import org.dromara.hutool.core.bean.path.node.NameNode;
+import org.dromara.hutool.core.bean.path.node.Node;
+import org.dromara.hutool.core.reflect.ConstructorUtil;
+import org.dromara.hutool.core.reflect.FieldUtil;
+
+import java.lang.reflect.Field;
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+/**
+ * 默认的Bean创建器
+ *
+ * @author looly
+ * @since 6.0.0
+ */
+public class DefaultNodeBeanCreator implements NodeBeanCreator {
+
+ /**
+ * 单例
+ */
+ public static final NodeBeanCreator INSTANCE = new DefaultNodeBeanCreator();
+
+ @Override
+ public Object create(final Object parent, final BeanPath beanPath) {
+ if(parent instanceof Map || parent instanceof List || ArrayUtil.isArray(parent)){
+ // 根据下一个节点类型,判断当前节点名称对应类型
+ final Node node = beanPath.next().getNode();
+ if (node instanceof NameNode) {
+ return ((NameNode) node).isNumber() ? new ArrayList<>() : new HashMap<>();
+ }
+ return new HashMap<>();
+ }
+
+ // 普通Bean
+ final Node node = beanPath.getNode();
+ if(node instanceof NameNode){
+ final String name = ((NameNode) node).getName();
+
+ final Field field = FieldUtil.getField(parent.getClass(), name);
+ if(null == field){
+ throw new IllegalArgumentException("No field found for name: " + name);
+ }
+ return ConstructorUtil.newInstanceIfPossible(field.getType());
+ }
+
+ throw new UnsupportedOperationException("Unsupported node type: " + node.getClass());
+ }
+}
diff --git a/hutool-core/src/main/java/org/dromara/hutool/core/bean/path/NodeBeanCreator.java b/hutool-core/src/main/java/org/dromara/hutool/core/bean/path/NodeBeanCreator.java
new file mode 100644
index 000000000..ac1151ace
--- /dev/null
+++ b/hutool-core/src/main/java/org/dromara/hutool/core/bean/path/NodeBeanCreator.java
@@ -0,0 +1,38 @@
+/*
+ * Copyright (c) 2024 Hutool Team and hutool.cn
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * 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 org.dromara.hutool.core.bean.path;
+
+/**
+ * BeanPath节点对应的Bean创建器
+ * 用于创建Bean路径节点对应的Bean
+ *
+ * @author looly
+ * @since 6.0.0
+ */
+public interface NodeBeanCreator {
+
+ /**
+ * 创建Bean
+ * beanPath对应当前的路径,即如果父对象为:a,则beanPath为:a.b,则创建的Bean为:a.b.c对应的Bean对象
+ * 给定的a一定存在,但是本路径中b对应的Bean不存在,则创建的对象是b的值,这个值用c表示
+ *
+ * @param parent 父Bean
+ * @param beanPath 当前路径
+ * @return Bean
+ */
+ Object create(final Object parent, final BeanPath beanPath);
+}
diff --git a/hutool-core/src/main/java/org/dromara/hutool/core/bean/path/node/NameNode.java b/hutool-core/src/main/java/org/dromara/hutool/core/bean/path/node/NameNode.java
index f86e02ace..e4e0c93d2 100644
--- a/hutool-core/src/main/java/org/dromara/hutool/core/bean/path/node/NameNode.java
+++ b/hutool-core/src/main/java/org/dromara/hutool/core/bean/path/node/NameNode.java
@@ -34,6 +34,15 @@ public class NameNode implements Node {
private final String name;
+ /**
+ * 获取节点名
+ *
+ * @return 节点名
+ */
+ public String getName() {
+ return name;
+ }
+
/**
* 构造
*
diff --git a/hutool-core/src/main/java/org/dromara/hutool/core/codec/Hashids.java b/hutool-core/src/main/java/org/dromara/hutool/core/codec/Hashids.java
index e85ff47a3..b2d150468 100644
--- a/hutool-core/src/main/java/org/dromara/hutool/core/codec/Hashids.java
+++ b/hutool-core/src/main/java/org/dromara/hutool/core/codec/Hashids.java
@@ -505,7 +505,7 @@ public class Hashids implements Encoder, Decoder
return IntStream.range(0, separators.length)
.mapToObj(idx -> (separators[idx]))
.filter(valid::contains)
- // ugly way to convert back to char[]
+ // ugly way to support back to char[]
.map(c -> Character.toString(c))
.collect(Collectors.joining())
.toCharArray();
diff --git a/hutool-core/src/main/java/org/dromara/hutool/core/codec/PercentCodec.java b/hutool-core/src/main/java/org/dromara/hutool/core/codec/PercentCodec.java
index 5a77b5414..d3c226130 100644
--- a/hutool-core/src/main/java/org/dromara/hutool/core/codec/PercentCodec.java
+++ b/hutool-core/src/main/java/org/dromara/hutool/core/codec/PercentCodec.java
@@ -135,7 +135,7 @@ public class PercentCodec implements Encoder, Serializable {
// 对于空格单独处理
rewrittenPath.append('+');
} else {
- // convert to external encoding before hex conversion
+ // support to external encoding before hex conversion
try {
writer.write(c);
writer.flush();
diff --git a/hutool-core/src/main/java/org/dromara/hutool/core/codec/binary/Z85Codec.java b/hutool-core/src/main/java/org/dromara/hutool/core/codec/binary/Z85Codec.java
index f577bcf6f..29763e108 100644
--- a/hutool-core/src/main/java/org/dromara/hutool/core/codec/binary/Z85Codec.java
+++ b/hutool-core/src/main/java/org/dromara/hutool/core/codec/binary/Z85Codec.java
@@ -67,7 +67,7 @@ public class Z85Codec implements Encoder, Decoder>> 2) + (remainder == 0 ? 0 : 1)];
int idx = 0;
diff --git a/hutool-core/src/main/java/org/dromara/hutool/core/convert/AbstractConverter.java b/hutool-core/src/main/java/org/dromara/hutool/core/convert/AbstractConverter.java
index 02731dc50..b86d787fb 100644
--- a/hutool-core/src/main/java/org/dromara/hutool/core/convert/AbstractConverter.java
+++ b/hutool-core/src/main/java/org/dromara/hutool/core/convert/AbstractConverter.java
@@ -45,7 +45,7 @@ public abstract class AbstractConverter implements Converter, Serializable {
return null;
}
if (TypeUtil.isUnknown(targetType)) {
- throw new ConvertException("Unsupported convert to unKnown type: {}", targetType);
+ throw new ConvertException("Unsupported support to unKnown type: {}", targetType);
}
final Class> targetClass = TypeUtil.getClass(targetType);
diff --git a/hutool-core/src/main/java/org/dromara/hutool/core/convert/CompositeConverter.java b/hutool-core/src/main/java/org/dromara/hutool/core/convert/CompositeConverter.java
index c57192b8c..fb16e2565 100644
--- a/hutool-core/src/main/java/org/dromara/hutool/core/convert/CompositeConverter.java
+++ b/hutool-core/src/main/java/org/dromara/hutool/core/convert/CompositeConverter.java
@@ -201,6 +201,6 @@ public class CompositeConverter implements Converter, Serializable {
}
// 无法转换
- throw new ConvertException("Can not convert from {}: [{}] to [{}]", value.getClass().getName(), value, type.getTypeName());
+ throw new ConvertException("Can not support from {}: [{}] to [{}]", value.getClass().getName(), value, type.getTypeName());
}
}
diff --git a/hutool-core/src/main/java/org/dromara/hutool/core/convert/RegisterConverter.java b/hutool-core/src/main/java/org/dromara/hutool/core/convert/RegisterConverter.java
index e614606d2..97707d225 100644
--- a/hutool-core/src/main/java/org/dromara/hutool/core/convert/RegisterConverter.java
+++ b/hutool-core/src/main/java/org/dromara/hutool/core/convert/RegisterConverter.java
@@ -90,7 +90,7 @@ public class RegisterConverter extends ConverterWithRoot implements Serializable
}
// 无法转换
- throw new ConvertException("Can not convert from {}: [{}] to [{}]", value.getClass().getName(), value, targetType.getTypeName());
+ throw new ConvertException("Can not support from {}: [{}] to [{}]", value.getClass().getName(), value, targetType.getTypeName());
}
/**
diff --git a/hutool-core/src/main/java/org/dromara/hutool/core/convert/impl/DateConverter.java b/hutool-core/src/main/java/org/dromara/hutool/core/convert/impl/DateConverter.java
index 87f02c392..a1236f4a6 100644
--- a/hutool-core/src/main/java/org/dromara/hutool/core/convert/impl/DateConverter.java
+++ b/hutool-core/src/main/java/org/dromara/hutool/core/convert/impl/DateConverter.java
@@ -108,7 +108,7 @@ public class DateConverter extends AbstractConverter implements MatcherConverter
}
}
- throw new ConvertException("Can not convert {}:[{}] to {}", value.getClass().getName(), value, targetClass.getName());
+ throw new ConvertException("Can not support {}:[{}] to {}", value.getClass().getName(), value, targetClass.getName());
}
/**
diff --git a/hutool-core/src/main/java/org/dromara/hutool/core/convert/impl/EnumConverter.java b/hutool-core/src/main/java/org/dromara/hutool/core/convert/impl/EnumConverter.java
index f4aee2887..fb7025c62 100644
--- a/hutool-core/src/main/java/org/dromara/hutool/core/convert/impl/EnumConverter.java
+++ b/hutool-core/src/main/java/org/dromara/hutool/core/convert/impl/EnumConverter.java
@@ -67,7 +67,7 @@ public class EnumConverter extends AbstractConverter implements MatcherConverter
return enumValue;
}
- throw new ConvertException("Can not convert {} to {}", value, targetClass);
+ throw new ConvertException("Can not support {} to {}", value, targetClass);
}
/**
diff --git a/hutool-core/src/main/java/org/dromara/hutool/core/convert/impl/NumberConverter.java b/hutool-core/src/main/java/org/dromara/hutool/core/convert/impl/NumberConverter.java
index be925da88..0068ccc05 100644
--- a/hutool-core/src/main/java/org/dromara/hutool/core/convert/impl/NumberConverter.java
+++ b/hutool-core/src/main/java/org/dromara/hutool/core/convert/impl/NumberConverter.java
@@ -78,7 +78,7 @@ public class NumberConverter extends AbstractConverter implements MatcherConvert
protected String convertToStr(final Object value) {
final String result = StrUtil.trim(super.convertToStr(value));
if(StrUtil.isEmpty(result)){
- throw new ConvertException("Can not convert empty value to Number!");
+ throw new ConvertException("Can not support empty value to Number!");
}
if (result.length() > 1) {
diff --git a/hutool-core/src/main/java/org/dromara/hutool/core/convert/impl/PrimitiveConverter.java b/hutool-core/src/main/java/org/dromara/hutool/core/convert/impl/PrimitiveConverter.java
index 884cfcbb4..2d6227f2c 100644
--- a/hutool-core/src/main/java/org/dromara/hutool/core/convert/impl/PrimitiveConverter.java
+++ b/hutool-core/src/main/java/org/dromara/hutool/core/convert/impl/PrimitiveConverter.java
@@ -76,7 +76,7 @@ public class PrimitiveConverter extends AbstractConverter implements MatcherConv
}
if(null == result){
- throw new ConvertException("Can not convert {} to {}", value, primitiveClass);
+ throw new ConvertException("Can not support {} to {}", value, primitiveClass);
}
return result;
diff --git a/hutool-core/src/main/java/org/dromara/hutool/core/date/format/FastDateFormat.java b/hutool-core/src/main/java/org/dromara/hutool/core/date/format/FastDateFormat.java
index ce0ffe233..91feb8442 100644
--- a/hutool-core/src/main/java/org/dromara/hutool/core/date/format/FastDateFormat.java
+++ b/hutool-core/src/main/java/org/dromara/hutool/core/date/format/FastDateFormat.java
@@ -408,7 +408,7 @@ public class FastDateFormat extends Format implements PositionDateParser, DatePr
return printer.getMaxLengthEstimate();
}
- // convert DateTimeFormatter
+ // support DateTimeFormatter
// -----------------------------------------------------------------------
/**
diff --git a/hutool-core/src/main/java/org/dromara/hutool/core/lang/Version.java b/hutool-core/src/main/java/org/dromara/hutool/core/lang/Version.java
index 4fe04c317..9515249ed 100644
--- a/hutool-core/src/main/java/org/dromara/hutool/core/lang/Version.java
+++ b/hutool-core/src/main/java/org/dromara/hutool/core/lang/Version.java
@@ -266,7 +266,7 @@ public class Version implements Comparable, Serializable {
}
return c;
}
- // Types differ, so convert number to string form
+ // Types differ, so support number to string form
final int c = o1.toString().compareTo(o2.toString());
if (c == 0){
continue;
diff --git a/hutool-core/src/test/java/org/dromara/hutool/core/convert/ConvertTest.java b/hutool-core/src/test/java/org/dromara/hutool/core/convert/ConvertTest.java
index f02b07c3a..99dc2f86f 100644
--- a/hutool-core/src/test/java/org/dromara/hutool/core/convert/ConvertTest.java
+++ b/hutool-core/src/test/java/org/dromara/hutool/core/convert/ConvertTest.java
@@ -329,7 +329,7 @@ public class ConvertTest {
@Test
public void toClassTest(){
- final Class> convert = ConvertUtil.convert(Class.class, "org.dromara.hutool.core.convert.ConvertTest.Product");
+ final Class> convert = ConvertUtil.convert(Class.class, "org.dromara.hutool.core.support.ConvertTest.Product");
Assertions.assertSame(Product.class, convert);
}
diff --git a/hutool-core/src/test/java/org/dromara/hutool/core/util/ByteUtilTest.java b/hutool-core/src/test/java/org/dromara/hutool/core/util/ByteUtilTest.java
index 04ff90634..cb99b9534 100644
--- a/hutool-core/src/test/java/org/dromara/hutool/core/util/ByteUtilTest.java
+++ b/hutool-core/src/test/java/org/dromara/hutool/core/util/ByteUtilTest.java
@@ -219,7 +219,7 @@ public class ByteUtilTest {
final byte[] bytes = new byte[]{(byte) 0xFF, (byte) 0xFE, (byte) 0x01, (byte) 0x00};
final int expectedValue = 130815;
final int actualValue = ByteUtil.toInt(bytes, 0, ByteOrder.LITTLE_ENDIAN);
- assertEquals(expectedValue, actualValue, "Failed to convert bytes to int using LITTLE_ENDIAN");
+ assertEquals(expectedValue, actualValue, "Failed to support bytes to int using LITTLE_ENDIAN");
}
@Test
@@ -228,6 +228,6 @@ public class ByteUtilTest {
final byte[] bytes = new byte[]{(byte) 0xFF, (byte) 0xFE, (byte) 0x01, (byte) 0x00};
final int expectedValue = -130816;
final int actualValue = ByteUtil.toInt(bytes, 0, ByteOrder.BIG_ENDIAN);
- assertEquals(expectedValue, actualValue, "Failed to convert bytes to int using BIG_ENDIAN");
+ assertEquals(expectedValue, actualValue, "Failed to support bytes to int using BIG_ENDIAN");
}
}
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 a698cfdc5..fccfef873 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
@@ -16,24 +16,23 @@
package org.dromara.hutool.json;
-import org.dromara.hutool.core.array.ArrayUtil;
import org.dromara.hutool.core.bean.copier.CopyOptions;
import org.dromara.hutool.core.codec.binary.HexUtil;
-import org.dromara.hutool.core.convert.ConvertUtil;
import org.dromara.hutool.core.io.IORuntimeException;
import org.dromara.hutool.core.map.CaseInsensitiveLinkedMap;
import org.dromara.hutool.core.map.CaseInsensitiveTreeMap;
-import org.dromara.hutool.core.math.NumberUtil;
import org.dromara.hutool.core.text.CharUtil;
import org.dromara.hutool.core.text.StrUtil;
-import org.dromara.hutool.core.text.split.SplitUtil;
import org.dromara.hutool.core.util.ObjUtil;
-import org.dromara.hutool.json.mapper.JSONValueMapper;
+import org.dromara.hutool.json.serializer.JSONMapper;
import org.dromara.hutool.json.reader.JSONTokener;
import java.io.IOException;
import java.math.BigDecimal;
-import java.util.*;
+import java.util.Comparator;
+import java.util.LinkedHashMap;
+import java.util.Map;
+import java.util.TreeMap;
/**
* 内部JSON工具类,仅用于JSON内部使用
@@ -88,65 +87,6 @@ public final class InternalJSONUtil {
return string;
}
- /**
- * 值转为String,用于JSON中。规则为:
- *
- *
对象如果是数组或Collection,包装为{@link JSONArray}
- *
对象如果是Map,包装为{@link JSONObject}
- *
对象如果是数字,使用{@link NumberUtil#toStr(Number)}转换为字符串
- *
其他情况调用toString并使用双引号包装
- *
- *
- * @param value 需要转为字符串的对象
- * @return 字符串
- * @throws JSONException If the value is or contains an invalid number.
- */
- static String valueToString(final Object value) throws JSONException {
- if (value == null) {
- return StrUtil.NULL;
- }
- if (value instanceof Number) {
- return NumberUtil.toStr((Number) value);
- } else if (value instanceof Boolean || value instanceof JSONObject || value instanceof JSONArray) {
- return value.toString();
- } else if (value instanceof Map) {
- final Map, ?> map = (Map, ?>) value;
- return JSONUtil.parseObj(map).toString();
- } else if (value instanceof Collection) {
- final Collection> coll = (Collection>) value;
- return JSONUtil.parseArray(coll).toString();
- } else if (ArrayUtil.isArray(value)) {
- return JSONUtil.parseArray(value).toString();
- } else {
- return quote(value.toString());
- }
- }
-
- /**
- * 将Property的键转化为JSON形式
- * 用于识别类似于:org.dromara.hutool.json这类用点隔开的键
- * 注意:不允许重复键
- *
- * @param jsonObject JSONObject
- * @param key 键
- * @param value 值
- */
- public static void propertyPut(final JSONObject jsonObject, final Object key, final Object value) {
- final String[] path = SplitUtil.splitToArray(ConvertUtil.toStr(key), StrUtil.DOT);
- final int last = path.length - 1;
- JSONObject target = jsonObject;
- for (int i = 0; i < last; i += 1) {
- final String segment = path[i];
- JSONObject nextTarget = target.getJSONObject(segment);
- if (nextTarget == null) {
- nextTarget = new JSONObject(target.config());
- target.set(segment, nextTarget);
- }
- target = nextTarget;
- }
- target.set(path[last], value);
- }
-
/**
* 默认情况下是否忽略null值的策略选择,以下对象不忽略null值,其它对象忽略:
*
@@ -179,7 +119,7 @@ public final class InternalJSONUtil {
.setIgnoreError(config.isIgnoreError())
.setIgnoreNullValue(config.isIgnoreNullValue())
.setTransientSupport(config.isTransientSupport())
- .setConverter((targetType, value) -> JSONValueMapper.of(config, null).map(value));
+ .setConverter((targetType, value) -> JSONMapper.of(config, null).map(value));
}
/**
diff --git a/hutool-json/src/main/java/org/dromara/hutool/json/JSON.java b/hutool-json/src/main/java/org/dromara/hutool/json/JSON.java
index 19af217c4..c10719c36 100644
--- a/hutool-json/src/main/java/org/dromara/hutool/json/JSON.java
+++ b/hutool-json/src/main/java/org/dromara/hutool/json/JSON.java
@@ -18,9 +18,10 @@ package org.dromara.hutool.json;
import org.dromara.hutool.core.bean.path.BeanPath;
import org.dromara.hutool.core.lang.mutable.MutableEntry;
-import org.dromara.hutool.core.util.ObjUtil;
import org.dromara.hutool.json.serializer.JSONDeserializer;
+import org.dromara.hutool.json.serializer.JSONMapper;
import org.dromara.hutool.json.serializer.TypeAdapterManager;
+import org.dromara.hutool.json.support.JSONNodeBeanCreator;
import org.dromara.hutool.json.writer.JSONWriter;
import java.io.Serializable;
@@ -138,7 +139,7 @@ public interface JSON extends Serializable {
* @param value 值
*/
default void putByPath(final String expression, final Object value) {
- BeanPath.of(expression).setValue(this, value);
+ BeanPath.of(expression).setBeanCreator(new JSONNodeBeanCreator(config())).setValue(this, value);
}
/**
@@ -228,33 +229,8 @@ public interface JSON extends Serializable {
* @param Bean类型
* @param type {@link Type}
* @return 实体类对象
- * @since 4.3.2
*/
- @SuppressWarnings("unchecked")
default T toBean(final Type type) {
- if(null == type || Object.class == type){
- if(this instanceof JSONPrimitive){
- return (T) ((JSONPrimitive) this).getValue();
- }
- return (T) this;
- }
-
- final JSONDeserializer