From a4db1e0e5282b66a2d97e09436a7eb2ce086fc61 Mon Sep 17 00:00:00 2001 From: Looly Date: Fri, 10 Jun 2022 22:53:30 +0800 Subject: [PATCH] fix --- .../java/cn/hutool/json/ObjectMapper.java | 10 +++++++++- .../java/cn/hutool/json/Issue2369Test.java | 19 +++++++++++++++++++ 2 files changed, 28 insertions(+), 1 deletion(-) create mode 100644 hutool-json/src/test/java/cn/hutool/json/Issue2369Test.java 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); + } +}