diff --git a/CHANGELOG.md b/CHANGELOG.md
index e964fcdac..3a7290ce3 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -6,7 +6,9 @@
## 5.0.1
### 新特性
+* 【json】 JSONUtil.toBean支持JSONArray
### Bug修复
+* 【extra】 修复getSession端口判断错误
-------------------------------------------------------------------------------------------------------------
diff --git a/hutool-extra/src/main/java/cn/hutool/extra/ssh/JschUtil.java b/hutool-extra/src/main/java/cn/hutool/extra/ssh/JschUtil.java
index ec10f4d6b..63c4bb6a2 100644
--- a/hutool-extra/src/main/java/cn/hutool/extra/ssh/JschUtil.java
+++ b/hutool-extra/src/main/java/cn/hutool/extra/ssh/JschUtil.java
@@ -157,7 +157,7 @@ public class JschUtil {
*/
public static Session createSession(String sshHost, int sshPort, String sshUser, String privateKeyPath, byte[] passphrase) {
Assert.notEmpty(sshHost, "SSH Host must be not empty!");
- Assert.isTrue(sshPort < 0, "SSH Host must be not empty!");
+ Assert.isTrue(sshPort > 0, "SSH port must be > 0");
Assert.notEmpty(privateKeyPath, "PrivateKey Path must be not empty!");
// 默认root用户
diff --git a/hutool-extra/src/test/java/cn/hutool/extra/ssh/JschUtilTest.java b/hutool-extra/src/test/java/cn/hutool/extra/ssh/JschUtilTest.java
index 5c57880c8..444f77c6f 100644
--- a/hutool-extra/src/test/java/cn/hutool/extra/ssh/JschUtilTest.java
+++ b/hutool-extra/src/test/java/cn/hutool/extra/ssh/JschUtilTest.java
@@ -1,5 +1,6 @@
package cn.hutool.extra.ssh;
+import com.jcraft.jsch.JSch;
import org.junit.Ignore;
import org.junit.Test;
@@ -61,4 +62,9 @@ public class JschUtilTest {
IoUtil.close(sftp);
}
+
+ @Test
+ public void getSessionTest(){
+ JschUtil.getSession("192.168.1.134", 22, "root", "aaa", null);
+ }
}
diff --git a/hutool-json/src/main/java/cn/hutool/json/JSON.java b/hutool-json/src/main/java/cn/hutool/json/JSON.java
index ca71ebd36..cdbe26e6f 100644
--- a/hutool-json/src/main/java/cn/hutool/json/JSON.java
+++ b/hutool-json/src/main/java/cn/hutool/json/JSON.java
@@ -1,17 +1,19 @@
package cn.hutool.json;
import java.io.Serializable;
+import java.io.StringWriter;
import java.io.Writer;
+import java.lang.reflect.Type;
import cn.hutool.core.bean.BeanPath;
+import cn.hutool.core.lang.TypeReference;
/**
* JSON接口
- *
- * @author Looly
*
+ * @author Looly
*/
-public interface JSON extends Cloneable, Serializable{
+public interface JSON extends Cloneable, Serializable {
/**
* 通过表达式获取JSON中嵌套的对象
@@ -19,16 +21,16 @@ public interface JSON extends Cloneable, Serializable{
*
.表达式,可以获取Bean对象中的属性(字段)值或者Map中key对应的值
* []表达式,可以获取集合等对象中对应index的值
*
- *
+ *
* 表达式栗子:
- *
+ *
*
* persion
* persion.name
* persons[3]
* person.friends[5].name
*
- *
+ *
* @param expression 表达式
* @return 对象
* @see BeanPath#get(Object)
@@ -44,20 +46,20 @@ public interface JSON extends Cloneable, Serializable{
* .表达式,可以获取Bean对象中的属性(字段)值或者Map中key对应的值
* []表达式,可以获取集合等对象中对应index的值
*
- *
+ *
* 表达式栗子:
- *
+ *
*
* persion
* persion.name
* persons[3]
* person.friends[5].name
*
- *
+ *
* @param expression 表达式
- * @param value 值
+ * @param value 值
*/
- public void putByPath(String expression, Object value);
+ void putByPath(String expression, Object value);
/**
* 通过表达式获取JSON中嵌套的对象
@@ -65,19 +67,19 @@ public interface JSON extends Cloneable, Serializable{
* .表达式,可以获取Bean对象中的属性(字段)值或者Map中key对应的值
* []表达式,可以获取集合等对象中对应index的值
*
- *
+ *
* 表达式栗子:
- *
+ *
*
* persion
* persion.name
* persons[3]
* person.friends[5].name
*
- *
+ *
* 获取表达式对应值后转换为对应类型的值
- *
- * @param 返回值类型
+ *
+ * @param 返回值类型
* @param expression 表达式
* @param resultType 返回值类型
* @return 对象
@@ -86,43 +88,100 @@ public interface JSON extends Cloneable, Serializable{
*/
T getByPath(String expression, Class resultType);
+ /**
+ * 格式化打印JSON,缩进为4个空格
+ *
+ * @return 格式化后的JSON字符串
+ * @throws JSONException 包含非法数抛出此异常
+ * @since 3.0.9
+ */
+ default String toStringPretty() throws JSONException {
+ return this.toJSONString(4);
+ }
+
+ /**
+ * 格式化输出JSON字符串
+ *
+ * @param indentFactor 每层缩进空格数
+ * @return JSON字符串
+ * @throws JSONException 包含非法数抛出此异常
+ */
+ default String toJSONString(int indentFactor) throws JSONException {
+ final StringWriter sw = new StringWriter();
+ synchronized (sw.getBuffer()) {
+ return this.write(sw, indentFactor, 0).toString();
+ }
+ }
+
/**
* 将JSON内容写入Writer,无缩进
* Warning: This method assumes that the data structure is acyclical.
- *
+ *
* @param writer Writer
* @return Writer
* @throws JSONException JSON相关异常
*/
- Writer write(Writer writer) throws JSONException;
+ default Writer write(Writer writer) throws JSONException {
+ return this.write(writer, 0, 0);
+ }
/**
* 将JSON内容写入Writer
* Warning: This method assumes that the data structure is acyclical.
- *
- * @param writer writer
+ *
+ * @param writer writer
* @param indentFactor 缩进因子,定义每一级别增加的缩进量
- * @param indent 本级别缩进量
+ * @param indent 本级别缩进量
* @return Writer
* @throws JSONException JSON相关异常
*/
Writer write(Writer writer, int indentFactor, int indent) throws JSONException;
/**
- * 转换为JSON字符串
- *
- * @param indentFactor 缩进因子,定义每一级别增加的缩进量
- * @return JSON字符串
- * @throws JSONException JSON相关异常
+ * 转为实体类对象,转换异常将被抛出
+ *
+ * @param Bean类型
+ * @param clazz 实体类
+ * @return 实体类对象
*/
- String toJSONString(int indentFactor) throws JSONException;
+ default T toBean(Class clazz) {
+ return toBean((Type) clazz);
+ }
/**
- * 格式化打印JSON,缩进为4个空格
- *
- * @return 格式化后的JSON字符串
- * @throws JSONException 包含非法数抛出此异常
- * @since 3.0.9
+ * 转为实体类对象,转换异常将被抛出
+ *
+ * @param Bean类型
+ * @param reference {@link TypeReference}类型参考子类,可以获取其泛型参数中的Type类型
+ * @return 实体类对象
+ * @since 4.2.2
*/
- String toStringPretty() throws JSONException;
+ default T toBean(TypeReference reference) {
+ return toBean(reference.getType());
+ }
+
+ /**
+ * 转为实体类对象
+ *
+ * @param Bean类型
+ * @param type {@link Type}
+ * @return 实体类对象
+ * @since 3.0.8
+ */
+ default T toBean(Type type) {
+ return toBean(type, false);
+ }
+
+ /**
+ * 转为实体类对象
+ *
+ * @param Bean类型
+ * @param type {@link Type}
+ * @param ignoreError 是否忽略转换错误
+ * @return 实体类对象
+ * @since 4.3.2
+ */
+ default T toBean(Type type, boolean ignoreError) {
+ return JSONConverter.jsonConvert(type, this, ignoreError);
+ }
}
diff --git a/hutool-json/src/main/java/cn/hutool/json/JSONArray.java b/hutool-json/src/main/java/cn/hutool/json/JSONArray.java
index 6c1198db2..49610bc68 100644
--- a/hutool-json/src/main/java/cn/hutool/json/JSONArray.java
+++ b/hutool-json/src/main/java/cn/hutool/json/JSONArray.java
@@ -1,15 +1,5 @@
package cn.hutool.json;
-import java.io.IOException;
-import java.io.StringWriter;
-import java.io.Writer;
-import java.util.ArrayList;
-import java.util.Collection;
-import java.util.Iterator;
-import java.util.List;
-import java.util.ListIterator;
-import java.util.RandomAccess;
-
import cn.hutool.core.bean.BeanPath;
import cn.hutool.core.collection.ArrayIter;
import cn.hutool.core.collection.CollUtil;
@@ -20,6 +10,15 @@ import cn.hutool.core.util.TypeUtil;
import cn.hutool.json.serialize.GlobalSerializeMapping;
import cn.hutool.json.serialize.JSONSerializer;
+import java.io.IOException;
+import java.io.Writer;
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.Iterator;
+import java.util.List;
+import java.util.ListIterator;
+import java.util.RandomAccess;
+
/**
* JSON数组
* JSON数组是表示中括号括住的数据表现形式
@@ -498,38 +497,6 @@ public class JSONArray extends JSONGetter implements JSON, List