diff --git a/hutool-json/src/main/java/cn/hutool/json/ObjectMapper.java b/hutool-json/src/main/java/cn/hutool/json/ObjectMapper.java index cc8592c2e..8d0df16cb 100755 --- a/hutool-json/src/main/java/cn/hutool/json/ObjectMapper.java +++ b/hutool-json/src/main/java/cn/hutool/json/ObjectMapper.java @@ -145,7 +145,15 @@ public class ObjectMapper { mapFromTokener(new JSONTokener((InputStream) source, jsonArray.getConfig()), jsonArray, filter); } else if (source instanceof byte[]) { // bytes按照JSON的二进制流对待 - mapFromTokener(new JSONTokener(IoUtil.toStream((byte[]) source), jsonArray.getConfig()), jsonArray, filter); + try{ + mapFromTokener(new JSONTokener(IoUtil.toStream((byte[]) source), jsonArray.getConfig()), jsonArray, filter); + } catch (final JSONException ignore){ + // https://github.com/dromara/hutool/issues/2369 + // 非标准的二进制流,则按照普通数组对待 + for(final byte b : (byte[]) source){ + jsonArray.add(b); + } + } } else if (source instanceof JSONTokener) { mapFromTokener((JSONTokener) source, jsonArray, filter); } else { diff --git a/hutool-json/src/test/java/cn/hutool/json/Issue2369Test.java b/hutool-json/src/test/java/cn/hutool/json/Issue2369Test.java new file mode 100644 index 000000000..be9c1f8bd --- /dev/null +++ b/hutool-json/src/test/java/cn/hutool/json/Issue2369Test.java @@ -0,0 +1,19 @@ +package cn.hutool.json; + +import org.junit.Assert; +import org.junit.Test; + +public class Issue2369Test { + + @Test + public void toJsonStrTest(){ + //https://github.com/dromara/hutool/issues/2369 + // byte[]数组对于JSONArray来说,即可能是一个JSON字符串的二进制流,也可能是普通数组,因此需要做双向兼容 + final byte[] bytes = {10, 11}; + final String s = JSONUtil.toJsonStr(bytes); + Assert.assertEquals("[10,11]", s); + + final Object o = JSONUtil.toBean(s, byte[].class, false); + Assert.assertArrayEquals(bytes, (byte[])o); + } +}