Looly 5 years ago
parent
commit
73fd3b849f
21 changed files with 128 additions and 122 deletions
  1. 1 0
      CHANGELOG.md
  2. 8 8
      hutool-bloomFilter/src/main/java/cn/hutool/bloomfilter/BitSetBloomFilter.java
  3. 18 0
      hutool-core/src/main/java/cn/hutool/core/bean/BeanUtil.java
  4. 18 0
      hutool-core/src/main/java/cn/hutool/core/collection/CollUtil.java
  5. 2 0
      hutool-core/src/main/java/cn/hutool/core/collection/IterUtil.java
  6. 7 7
      hutool-core/src/main/java/cn/hutool/core/date/ChineseDate.java
  7. 2 3
      hutool-core/src/main/java/cn/hutool/core/io/FastByteArrayOutputStream.java
  8. 1 1
      hutool-core/src/main/java/cn/hutool/core/util/ArrayUtil.java
  9. 0 1
      hutool-core/src/main/java/cn/hutool/core/util/ZipUtil.java
  10. 11 61
      hutool-core/src/test/java/cn/hutool/core/clone/CloneTest.java
  11. 1 0
      hutool-core/src/test/java/cn/hutool/core/collection/CollUtilTest.java
  12. 6 6
      hutool-core/src/test/java/cn/hutool/core/collection/IterUtilTest.java
  13. 2 4
      hutool-core/src/test/java/cn/hutool/core/convert/NumberWordFormatTest.java
  14. 7 8
      hutool-db/src/main/java/cn/hutool/db/ds/AbstractDSFactory.java
  15. 1 2
      hutool-db/src/main/java/cn/hutool/db/meta/MetaUtil.java
  16. 4 4
      hutool-extra/src/test/java/cn/hutool/extra/template/BeetlUtilTest.java
  17. 11 5
      hutool-http/src/test/java/cn/hutool/http/test/RestTest.java
  18. 4 4
      hutool-json/src/main/java/cn/hutool/json/JSONArray.java
  19. 2 4
      hutool-json/src/main/java/cn/hutool/json/JSONObject.java
  20. 1 1
      hutool-json/src/test/java/cn/hutool/json/CustomSerializeTest.java
  21. 21 3
      hutool-json/src/test/java/cn/hutool/json/JSONUtilTest.java

+ 1 - 0
CHANGELOG.md

@@ -21,6 +21,7 @@
 * 【core   】     添加BiMap
 * 【all    】     cn.hutool.extra.servlet.multipart包迁移到cn.hutool.core.net下
 * 【core   】     XmlUtil.mapToXml方法支持集合解析(issue#820@Github)
+* 【json   】     解析Object中对是否为bean单独判断,而不是直接解析
 
 ### Bug修复
 * 【extra  】     修复SpringUtil使用devtools重启报错问题

+ 8 - 8
hutool-bloomFilter/src/main/java/cn/hutool/bloomfilter/BitSetBloomFilter.java

@@ -1,13 +1,13 @@
 package cn.hutool.bloomfilter;
 
-import java.io.BufferedReader;
-import java.io.IOException;
-import java.util.BitSet;
-
 import cn.hutool.core.io.FileUtil;
 import cn.hutool.core.io.IoUtil;
 import cn.hutool.core.util.HashUtil;
 
+import java.io.BufferedReader;
+import java.io.IOException;
+import java.util.BitSet;
+
 /**
  * BloomFilter实现方式2,此方式使用BitSet存储。<br>
  * Hash算法的使用使用固定顺序,只需指定个数即可
@@ -17,10 +17,10 @@ import cn.hutool.core.util.HashUtil;
 public class BitSetBloomFilter implements BloomFilter{
 	private static final long serialVersionUID = 1L;
 	
-	private BitSet bitSet;
-	private int bitSetSize;
-	private int addedElements;
-	private int hashFunctionNumber;
+	private final BitSet bitSet;
+	private final int bitSetSize;
+	private final int addedElements;
+	private final int hashFunctionNumber;
 
 	/**
 	 * 构造一个布隆过滤器,过滤器的容量为c * n 个bit.

+ 18 - 0
hutool-core/src/main/java/cn/hutool/core/bean/BeanUtil.java

@@ -43,6 +43,23 @@ import java.util.Map;
 public class BeanUtil {
 
 	/**
+	 * 判断是否为可读的Bean对象,判定方法是:
+	 *
+	 * <pre>
+	 *     1、是否存在只有无参数的getXXX方法或者isXXX方法
+	 *     2、是否存在public类型的字段
+	 * </pre>
+	 *
+	 * @param clazz 待测试类
+	 * @return 是否为可读的Bean对象
+	 * @see #hasGetter(Class) 
+	 * @see #hasPublicField(Class)
+	 */
+	public static boolean isReadableBean(Class<?> clazz) {
+		return hasGetter(clazz) || hasPublicField(clazz);
+	}
+
+	/**
 	 * 判断是否为Bean对象,判定方法是:
 	 *
 	 * <pre>
@@ -53,6 +70,7 @@ public class BeanUtil {
 	 * @param clazz 待测试类
 	 * @return 是否为Bean对象
 	 * @see #hasSetter(Class)
+	 * @see #hasPublicField(Class)
 	 */
 	public static boolean isBean(Class<?> clazz) {
 		return hasSetter(clazz) || hasPublicField(clazz);

+ 18 - 0
hutool-core/src/main/java/cn/hutool/core/collection/CollUtil.java

@@ -352,6 +352,24 @@ public class CollUtil {
 	}
 
 	/**
+	 * 以 conjunction 为分隔符将集合转换为字符串
+	 *
+	 * @param <T>         集合元素类型
+	 * @param iterable    {@link Iterable}
+	 * @param conjunction 分隔符
+	 * @param prefix      每个元素添加的前缀,null表示不添加
+	 * @param suffix      每个元素添加的后缀,null表示不添加
+	 * @return 连接后的字符串
+	 * @since 5.3.0
+	 */
+	public static <T> String join(Iterable<T> iterable, CharSequence conjunction, String prefix, String suffix) {
+		if (null == iterable) {
+			return null;
+		}
+		return IterUtil.join(iterable.iterator(), conjunction, prefix, suffix);
+	}
+
+	/**
 	 * 以 conjunction 为分隔符将集合转换为字符串<br>
 	 * 如果集合元素为数组、{@link Iterable}或{@link Iterator},则递归组合其为字符串
 	 *

+ 2 - 0
hutool-core/src/main/java/cn/hutool/core/collection/IterUtil.java

@@ -302,7 +302,9 @@ public class IterUtil {
 	 * @param suffix      每个元素添加的后缀,null表示不添加
 	 * @return 连接后的字符串
 	 * @since 4.0.10
+	 * @deprecated 如果对象同时实现Iterable和Iterator接口会产生歧义,请使用CollUtil.join
 	 */
+	@Deprecated
 	public static <T> String join(Iterable<T> iterable, CharSequence conjunction, String prefix, String suffix) {
 		if (null == iterable) {
 			return null;

+ 7 - 7
hutool-core/src/main/java/cn/hutool/core/date/ChineseDate.java

@@ -19,16 +19,16 @@ public class ChineseDate {
 	private static final Date baseDate = DateUtil.parseDate("1900-01-31");
 
 	//农历年
-	private int year;
+	private final int year;
 	//农历月
-	private int month;
+	private final int month;
 	//农历日
-	private int day;
+	private final int day;
 	//是否闰年
 	private boolean leap;
-	private String[] chineseNumber = {"一", "二", "三", "四", "五", "六", "七", "八", "九", "十", "十一", "十二"};
-	private String[] chineseNumberName = {"正", "二", "三", "四", "五", "六", "七", "八", "九", "十", "十一", "腊"};
-	private long[] lunarInfo = new long[]{0x04bd8, 0x04ae0, 0x0a570,
+	private final String[] chineseNumber = {"一", "二", "三", "四", "五", "六", "七", "八", "九", "十", "十一", "十二"};
+	private final String[] chineseNumberName = {"正", "二", "三", "四", "五", "六", "七", "八", "九", "十", "十一", "腊"};
+	private final long[] lunarInfo = new long[]{0x04bd8, 0x04ae0, 0x0a570,
 			0x054d5, 0x0d260, 0x0d950, 0x16554, 0x056a0, 0x09ad0, 0x055d2,
 			0x04ae0, 0x0a5b6, 0x0a4d0, 0x0d250, 0x1d255, 0x0b540, 0x0d6a0,
 			0x0ada2, 0x095b0, 0x14977, 0x04970, 0x0a4b0, 0x0b4b5, 0x06a50,
@@ -51,7 +51,7 @@ public class ChineseDate {
 			0x1d0b6, 0x0d250, 0x0d520, 0x0dd45, 0x0b5a0, 0x056d0, 0x055b2,
 			0x049b0, 0x0a577, 0x0a4b0, 0x0aa50, 0x1b255, 0x06d20, 0x0ada0};
 	//农历节日  *表示放假日
-	private String[] lFtv = new String[]{
+	private final String[] lFtv = new String[]{
 			"0101 春节", "0102 大年初二", "0103 大年初三", "0104 大年初四",
 			"0105 大年初五", "0106 大年初六", "0107 大年初七", "0105 路神生日",
 			"0115 元宵节", "0202 龙抬头", "0219 观世音圣诞", "0404 寒食节",

+ 2 - 3
hutool-core/src/main/java/cn/hutool/core/io/FastByteArrayOutputStream.java

@@ -1,11 +1,11 @@
 package cn.hutool.core.io;
 
+import cn.hutool.core.util.CharsetUtil;
+
 import java.io.IOException;
 import java.io.OutputStream;
 import java.nio.charset.Charset;
 
-import cn.hutool.core.util.CharsetUtil;
-
 /**
  * 基于快速缓冲FastByteBuffer的OutputStream,随着数据的增长自动扩充缓冲区
  * <p>
@@ -34,7 +34,6 @@ public class FastByteArrayOutputStream extends OutputStream {
 		buffer = new FastByteBuffer(size);
 	}
 
-	@SuppressWarnings("NullableProblems")
 	@Override
 	public void write(byte[] b, int off, int len) {
 		buffer.append(b, off, len);

+ 1 - 1
hutool-core/src/main/java/cn/hutool/core/util/ArrayUtil.java

@@ -2402,7 +2402,7 @@ public class ArrayUtil {
 			if (ArrayUtil.isArray(item)) {
 				sb.append(join(ArrayUtil.wrap(item), conjunction, prefix, suffix));
 			} else if (item instanceof Iterable<?>) {
-				sb.append(IterUtil.join((Iterable<?>) item, conjunction, prefix, suffix));
+				sb.append(CollUtil.join((Iterable<?>) item, conjunction, prefix, suffix));
 			} else if (item instanceof Iterator<?>) {
 				sb.append(IterUtil.join((Iterator<?>) item, conjunction, prefix, suffix));
 			} else {

+ 0 - 1
hutool-core/src/main/java/cn/hutool/core/util/ZipUtil.java

@@ -938,7 +938,6 @@ public class ZipUtil {
 				addDir(subPath, out);
 			}
 			// 压缩目录下的子文件或目录
-			//noinspection ConstantConditions
 			for (File childFile : files) {
 				zip(childFile, srcRootDir, out, filter);
 			}

+ 11 - 61
hutool-core/src/test/java/cn/hutool/core/clone/CloneTest.java

@@ -1,5 +1,7 @@
 package cn.hutool.core.clone;
 
+import lombok.Data;
+import lombok.EqualsAndHashCode;
 import org.junit.Assert;
 import org.junit.Test;
 
@@ -17,7 +19,10 @@ public class CloneTest {
 		Cat cat = new Cat();
 		Cat cat2 = cat.clone();
 		Assert.assertEquals(cat, cat2);
-		
+	}
+
+	@Test
+	public void cloneTest2(){
 		//继承CloneSupport类
 		Dog dog = new Dog();
 		Dog dog2 = dog.clone();
@@ -30,7 +35,8 @@ public class CloneTest {
 	 * @author Looly
 	 *
 	 */
-	private static class Cat implements Cloneable<Cat>{
+	@Data
+	static class Cat implements Cloneable<Cat>{
 		private String name = "miaomiao";
 		private int age = 2;
 		
@@ -42,35 +48,6 @@ public class CloneTest {
 				throw new CloneRuntimeException(e);
 			}
 		}
-
-		@Override
-		public int hashCode() {
-			final int prime = 31;
-			int result = 1;
-			result = prime * result + age;
-			result = prime * result + ((name == null) ? 0 : name.hashCode());
-			return result;
-		}
-
-		@Override
-		public boolean equals(Object obj) {
-			if (this == obj) {
-				return true;
-			}
-			if (obj == null) {
-				return false;
-			}
-			if (getClass() != obj.getClass()) {
-				return false;
-			}
-			Cat other = (Cat) obj;
-			if (age != other.age) {
-				return false;
-			}
-			if (name == null) {
-				return other.name == null;
-			} else return name.equals(other.name);
-		}
 	}
 	
 	/**
@@ -78,37 +55,10 @@ public class CloneTest {
 	 * @author Looly
 	 *
 	 */
-	private static class Dog extends CloneSupport<Dog>{
+	@EqualsAndHashCode(callSuper = false)
+	@Data
+	static class Dog extends CloneSupport<Dog>{
 		private String name = "wangwang";
 		private int age = 3;
-		
-		@Override
-		public int hashCode() {
-			final int prime = 31;
-			int result = 1;
-			result = prime * result + age;
-			result = prime * result + ((name == null) ? 0 : name.hashCode());
-			return result;
-		}
-		
-		@Override
-		public boolean equals(Object obj) {
-			if (this == obj) {
-				return true;
-			}
-			if (obj == null) {
-				return false;
-			}
-			if (getClass() != obj.getClass()) {
-				return false;
-			}
-			Dog other = (Dog) obj;
-			if (age != other.age) {
-				return false;
-			}
-			if (name == null) {
-				return other.name == null;
-			} else return name.equals(other.name);
-		}
 	}
 }

+ 1 - 0
hutool-core/src/test/java/cn/hutool/core/collection/CollUtilTest.java

@@ -179,6 +179,7 @@ public class CollUtilTest {
 		map.put("c", "3");
 
 		final String[] result = new String[1];
+		//noinspection deprecation
 		CollUtil.forEach(map, (key, value, index) -> {
 			if (key.equals("a")) {
 				result[0] = value;

+ 6 - 6
hutool-core/src/test/java/cn/hutool/core/collection/IterUtilTest.java

@@ -16,25 +16,25 @@ public class IterUtilTest {
 	@Test
 	public void fieldValueMapTest() {
 		ArrayList<Car> carList = CollUtil.newArrayList(new Car("123", "大众"), new Car("345", "奔驰"), new Car("567", "路虎"));
-		Map<String, Car> carNameMap = IterUtil.fieldValueMap(carList, "carNumber");
-		
+		Map<String, Car> carNameMap = IterUtil.fieldValueMap(carList.iterator(), "carNumber");
+
 		Assert.assertEquals("大众", carNameMap.get("123").getCarName());
 		Assert.assertEquals("奔驰", carNameMap.get("345").getCarName());
 		Assert.assertEquals("路虎", carNameMap.get("567").getCarName());
 	}
-	
+
 	@Test
 	public void joinTest() {
 		ArrayList<String> list = CollUtil.newArrayList("1", "2", "3", "4");
-		String join = IterUtil.join(list, ":");
+		String join = IterUtil.join(list.iterator(), ":");
 		Assert.assertEquals("1:2:3:4", join);
 		
 		ArrayList<Integer> list1 = CollUtil.newArrayList(1, 2, 3, 4);
-		String join1 = IterUtil.join(list1, ":");
+		String join1 = IterUtil.join(list1.iterator(), ":");
 		Assert.assertEquals("1:2:3:4", join1);
 		
 		ArrayList<String> list2 = CollUtil.newArrayList("1", "2", "3", "4");
-		String join2 = IterUtil.join(list2, ":", "\"", "\"");
+		String join2 = IterUtil.join(list2.iterator(), ":", "\"", "\"");
 		Assert.assertEquals("\"1\":\"2\":\"3\":\"4\"", join2);
 	}
 

+ 2 - 4
hutool-core/src/test/java/cn/hutool/core/convert/NumberWordFormatTest.java

@@ -3,16 +3,14 @@ package cn.hutool.core.convert;
 import org.junit.Assert;
 import org.junit.Test;
 
-import cn.hutool.core.convert.NumberWordFormater;
-
 public class NumberWordFormatTest {
 	
 	@Test
 	public void formatTest() {
-		String format = NumberWordFormater.format(100.23);
+		String format = NumberWordFormatter.format(100.23);
 		Assert.assertEquals("ONE HUNDRED AND CENTS TWENTY THREE ONLY", format);
 		
-		String format2 = NumberWordFormater.format("2100.00");
+		String format2 = NumberWordFormatter.format("2100.00");
 		Assert.assertEquals("TWO THOUSAND ONE HUNDRED AND CENTS  ONLY", format2);
 	}
 }

+ 7 - 8
hutool-db/src/main/java/cn/hutool/db/ds/AbstractDSFactory.java

@@ -1,11 +1,5 @@
 package cn.hutool.db.ds;
 
-import java.util.Collection;
-import java.util.Map;
-import java.util.concurrent.ConcurrentHashMap;
-
-import javax.sql.DataSource;
-
 import cn.hutool.core.collection.CollectionUtil;
 import cn.hutool.core.io.resource.NoResourceException;
 import cn.hutool.core.lang.Assert;
@@ -15,6 +9,11 @@ import cn.hutool.db.DbUtil;
 import cn.hutool.db.dialect.DriverUtil;
 import cn.hutool.setting.Setting;
 
+import javax.sql.DataSource;
+import java.util.Collection;
+import java.util.Map;
+import java.util.concurrent.ConcurrentHashMap;
+
 /**
  * 抽象数据源工厂<br>
  * 此工厂抽象类用于实现数据源的缓存,当用户多次调用{@link #getDataSource(String)} 时,工厂只需创建一次即可。<br>
@@ -32,9 +31,9 @@ public abstract class AbstractDSFactory extends DSFactory {
 	private static final String DEFAULT_DB_SETTING_PATH2 = "db.setting";
 
 	/** 数据库连接配置文件 */
-	private Setting setting;
+	private final Setting setting;
 	/** 数据源池 */
-	private Map<String, DataSourceWrapper> dsMap;
+	private final Map<String, DataSourceWrapper> dsMap;
 
 	/**
 	 * 构造

+ 1 - 2
hutool-db/src/main/java/cn/hutool/db/meta/MetaUtil.java

@@ -144,7 +144,7 @@ public class MetaUtil {
 					}
 				}
 			}
-			return columnNames.toArray(new String[columnNames.size()]);
+			return columnNames.toArray(new String[0]);
 		} catch (Exception e) {
 			throw new DbRuntimeException("Get columns error!", e);
 		} finally {
@@ -172,7 +172,6 @@ public class MetaUtil {
 	 * @param tableName 表名
 	 * @return Table对象
 	 */
-	@SuppressWarnings("resource")
 	public static Table getTableMeta(DataSource ds, String tableName) {
 		final Table table = Table.create(tableName);
 		Connection conn = null;

+ 4 - 4
hutool-extra/src/test/java/cn/hutool/extra/template/BeetlUtilTest.java

@@ -1,7 +1,7 @@
 package cn.hutool.extra.template;
 
-import java.io.IOException;
-
+import cn.hutool.core.lang.Dict;
+import cn.hutool.extra.template.engine.beetl.BeetlUtil;
 import org.beetl.core.Configuration;
 import org.beetl.core.GroupTemplate;
 import org.beetl.core.Template;
@@ -9,8 +9,7 @@ import org.beetl.core.resource.StringTemplateResourceLoader;
 import org.junit.Assert;
 import org.junit.Test;
 
-import cn.hutool.core.lang.Dict;
-import cn.hutool.extra.template.engine.beetl.BeetlUtil;
+import java.io.IOException;
 
 /**
  * BeetlUtil单元测试
@@ -18,6 +17,7 @@ import cn.hutool.extra.template.engine.beetl.BeetlUtil;
  * @author looly
  *
  */
+@SuppressWarnings("deprecation")
 public class BeetlUtilTest {
 
 	@Test

+ 11 - 5
hutool-http/src/test/java/cn/hutool/http/test/RestTest.java

@@ -14,13 +14,14 @@ import org.junit.Test;
  * @author looly
  *
  */
-@SuppressWarnings("ConstantConditions")
 public class RestTest {
 
 	@Test
 	public void contentTypeTest() {
 		HttpRequest request = HttpRequest.post("http://localhost:8090/rest/restTest/")//
-				.body(JSONUtil.createObj().put("aaa", "aaaValue").put("键2", "值2").toString());
+				.body(JSONUtil.createObj()
+						.set("aaa", "aaaValue")
+						.set("键2", "值2").toString());
 		Assert.assertEquals("application/json;charset=UTF-8", request.header("Content-Type"));
 	}
 
@@ -28,7 +29,9 @@ public class RestTest {
 	@Ignore
 	public void postTest() {
 		HttpRequest request = HttpRequest.post("http://localhost:8090/rest/restTest/")//
-				.body(JSONUtil.createObj().put("aaa", "aaaValue").put("键2", "值2").toString());
+				.body(JSONUtil.createObj()
+						.set("aaa", "aaaValue")
+						.set("键2", "值2").toString());
 		Console.log(request.execute().body());
 	}
 
@@ -36,7 +39,8 @@ public class RestTest {
 	@Ignore
 	public void postTest2() {
 		String result = HttpUtil.post("http://localhost:8090/rest/restTest/", JSONUtil.createObj()//
-				.put("aaa", "aaaValue").put("键2", "值2").toString());
+				.set("aaa", "aaaValue")
+				.set("键2", "值2").toString());
 		Console.log(result);
 	}
 
@@ -44,7 +48,9 @@ public class RestTest {
 	@Ignore
 	public void postTest3() {
 		HttpRequest request = HttpRequest.post("http://211.162.39.204:8181/jeesite-simple/a/open/bizGwbnService/test")//
-				.body(JSONUtil.createObj().put("aaa", "aaaValue").put("键2", "值2").toString());
+				.body(JSONUtil.createObj()
+						.set("aaa", "aaaValue")
+						.set("键2", "值2").toString());
 		Console.log(request.execute().body());
 	}
 }

+ 4 - 4
hutool-json/src/main/java/cn/hutool/json/JSONArray.java

@@ -3,6 +3,7 @@ package cn.hutool.json;
 import cn.hutool.core.bean.BeanPath;
 import cn.hutool.core.collection.ArrayIter;
 import cn.hutool.core.collection.CollUtil;
+import cn.hutool.core.util.ArrayUtil;
 import cn.hutool.core.util.CharUtil;
 import cn.hutool.core.util.ObjectUtil;
 import cn.hutool.core.util.StrUtil;
@@ -41,7 +42,7 @@ public class JSONArray implements JSON, JSONGetter<Integer>, List<Object>, Rando
 	/** 持有原始数据的List */
 	private final List<Object> rawList;
 	/** 配置项 */
-	private JSONConfig config;
+	private final JSONConfig config;
 
 	// -------------------------------------------------------------------------------------------------------------------- Constructor start
 	/**
@@ -365,14 +366,13 @@ public class JSONArray implements JSON, JSONGetter<Integer>, List<Object>, Rando
 		return rawList.contains(o);
 	}
 
-	@SuppressWarnings("NullableProblems")
 	@Override
 	public Object[] toArray() {
 		return rawList.toArray();
 	}
 
 	@Override
-	@SuppressWarnings({"unchecked", "NullableProblems"})
+	@SuppressWarnings({"unchecked"})
 	public <T> T[] toArray(T[] a) {
 		return (T[]) JSONConverter.toArray(this, a.getClass().getComponentType());
 	}
@@ -600,7 +600,7 @@ public class JSONArray implements JSON, JSONGetter<Integer>, List<Object>, Rando
 			init((JSONTokener) source);
 		} else {
 			Iterator<?> iter;
-			if (source.getClass().isArray()) {// 数组
+			if (ArrayUtil.isArray(source)) {// 数组
 				iter = new ArrayIter<>(source);
 			} else if (source instanceof Iterator<?>) {// Iterator
 				iter = ((Iterator<?>) source);

+ 2 - 4
hutool-json/src/main/java/cn/hutool/json/JSONObject.java

@@ -46,7 +46,7 @@ public class JSONObject implements JSON, JSONGetter<String>, Map<String, Object>
 	/** JSON的KV持有Map */
 	private final Map<String, Object> rawHashMap;
 	/** 配置项 */
-	private JSONConfig config;
+	private final JSONConfig config;
 
 	// -------------------------------------------------------------------------------------------------------------------- Constructor start
 	/**
@@ -677,9 +677,7 @@ public class JSONObject implements JSON, JSONGetter<String>, Map<String, Object>
 		} else if (source instanceof JSONTokener) {
 			// JSONTokener
 			init((JSONTokener) source);
-		} else if (source instanceof Number) {
-			// ignore Number
-		} else {
+		} else if(BeanUtil.isReadableBean(source.getClass())){
 			// 普通Bean
 			this.populateMap(source);
 		}

+ 1 - 1
hutool-json/src/test/java/cn/hutool/json/CustomSerializeTest.java

@@ -11,7 +11,7 @@ public class CustomSerializeTest {
 
 	@Test
 	public void serializeTest() {
-		JSONUtil.putSerializer(CustomBean.class, (JSONObjectSerializer<CustomBean>) (json, bean) -> json.put("customName", bean.name));
+		JSONUtil.putSerializer(CustomBean.class, (JSONObjectSerializer<CustomBean>) (json, bean) -> json.set("customName", bean.name));
 		
 		CustomBean customBean = new CustomBean();
 		customBean.name = "testName";

+ 21 - 3
hutool-json/src/test/java/cn/hutool/json/JSONUtilTest.java

@@ -25,6 +25,24 @@ public class JSONUtilTest {
 		Console.log(jsonArray);
 	}
 
+	/**
+	 * 数字解析为JSONArray报错
+	 */
+	@Test(expected = JSONException.class)
+	public void parseNumberTest(){
+		JSONArray json = JSONUtil.parseArray(123L);
+		Console.log(json);
+	}
+
+	/**
+	 * 数字解析为JSONObject忽略
+	 */
+	@Test
+	public void parseNumberTest2(){
+		JSONObject json = JSONUtil.parseObj(123L);
+		Assert.assertEquals(new JSONObject(), json);
+	}
+
 	@Test
 	public void toJsonStrTest() {
 		UserA a1 = new UserA();
@@ -67,9 +85,9 @@ public class JSONUtilTest {
 	public void toJsonStrTest3() {
 		// 验证某个字段为JSON字符串时转义是否规范
 		JSONObject object = new JSONObject(true);
-		object.put("name", "123123");
-		object.put("value", "\\");
-		object.put("value2", "</");
+		object.set("name", "123123");
+		object.set("value", "\\");
+		object.set("value2", "</");
 
 		HashMap<String, String> map = MapUtil.newHashMap();
 		map.put("user", object.toString());