From 2202465e31edb66eb68450709b5f397c9deb3d73 Mon Sep 17 00:00:00 2001 From: redkale Date: Tue, 9 May 2023 14:45:25 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BF=AE=E5=A4=8DJsonByteBuffer=E8=A7=A3?= =?UTF-8?q?=E6=9E=90bug?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../convert/json/JsonByteBufferReader.java | 6 +- .../org/redkale/convert/json/JsonReader.java | 2 +- src/main/java/org/redkale/util/ByteArray.java | 13 +- .../redkale/test/convert/JsonPvBeanTest.java | 212 ++++++++++++++++++ 4 files changed, 224 insertions(+), 9 deletions(-) create mode 100644 src/test/java/org/redkale/test/convert/JsonPvBeanTest.java diff --git a/src/main/java/org/redkale/convert/json/JsonByteBufferReader.java b/src/main/java/org/redkale/convert/json/JsonByteBufferReader.java index 7fe884b61..420a5f53b 100644 --- a/src/main/java/org/redkale/convert/json/JsonByteBufferReader.java +++ b/src/main/java/org/redkale/convert/json/JsonByteBufferReader.java @@ -164,6 +164,7 @@ public class JsonByteBufferReader extends JsonReader { if (ch == 'N' && nextChar() == 'U' && nextChar() == 'L' && nextChar() == 'L') { return SIGN_NULL; } + int pos = this.position; StringBuilder sb = new StringBuilder(); sb.append(ch); char one; @@ -171,7 +172,7 @@ public class JsonByteBufferReader extends JsonReader { while ((one = nextChar()) != 0) sb.append(one); } catch (Exception e) { } - throw new ConvertException("a json array text must begin with '[' (position = " + position + ") but '" + ch + "' in (" + sb + ")"); + throw new ConvertException("a json array text must begin with '[' (position = " + pos + ") but '" + ch + "' in (" + sb + ")"); } /** @@ -183,6 +184,7 @@ public class JsonByteBufferReader extends JsonReader { if (ch == ':') { return; } + int pos = this.position; StringBuilder sb = new StringBuilder(); sb.append(ch); char one; @@ -190,7 +192,7 @@ public class JsonByteBufferReader extends JsonReader { while ((one = nextChar()) != 0) sb.append(one); } catch (Exception e) { } - throw new ConvertException("expected a ':' but '" + ch + "'(position = " + position + ") in (" + sb + ")"); + throw new ConvertException("expected a ':' but '" + ch + "'(position = " + pos + ") in (" + sb + ")"); } /** diff --git a/src/main/java/org/redkale/convert/json/JsonReader.java b/src/main/java/org/redkale/convert/json/JsonReader.java index 4168d7a0a..0aa2273e4 100644 --- a/src/main/java/org/redkale/convert/json/JsonReader.java +++ b/src/main/java/org/redkale/convert/json/JsonReader.java @@ -365,7 +365,7 @@ public class JsonReader extends Reader { if (nt == '}' || nt == ']') { return false; } - backChar(ch); + backChar(nt); return true; } if (ch == '}' || ch == ']') { diff --git a/src/main/java/org/redkale/util/ByteArray.java b/src/main/java/org/redkale/util/ByteArray.java index d27517876..122034cb6 100644 --- a/src/main/java/org/redkale/util/ByteArray.java +++ b/src/main/java/org/redkale/util/ByteArray.java @@ -9,7 +9,7 @@ import java.io.*; import java.nio.ByteBuffer; import java.nio.channels.ReadableByteChannel; import java.nio.charset.*; -import java.util.Arrays; +import java.util.*; import java.util.concurrent.atomic.AtomicInteger; /** @@ -31,17 +31,18 @@ public final class ByteArray implements ByteTuple { } public ByteArray(int size) { - content = new byte[Math.max(1, size)]; + this.content = new byte[Math.max(1, size)]; } public ByteArray(ByteTuple tuple) { - content = tuple.content(); - count = tuple.length(); + this.content = tuple.content(); + this.count = tuple.length(); } public ByteArray(byte[] bs) { - content = bs; - count = 0; + Objects.requireNonNull(bs); + this.content = bs; + this.count = bs.length; } /** diff --git a/src/test/java/org/redkale/test/convert/JsonPvBeanTest.java b/src/test/java/org/redkale/test/convert/JsonPvBeanTest.java new file mode 100644 index 000000000..a2aa1d9fc --- /dev/null +++ b/src/test/java/org/redkale/test/convert/JsonPvBeanTest.java @@ -0,0 +1,212 @@ +/* + * + */ +package org.redkale.test.convert; + +import java.io.*; +import java.nio.ByteBuffer; +import java.nio.charset.StandardCharsets; +import java.util.List; +import org.junit.jupiter.api.*; +import org.redkale.annotation.Comment; +import org.redkale.convert.json.JsonConvert; +import org.redkale.util.TypeToken; + +/** + * + * @author zhangjx + */ +public class JsonPvBeanTest { + + public static void main(String[] args) throws Throwable { + JsonPvBeanTest test = new JsonPvBeanTest(); + test.run(); + } + + @Test + public void run() throws Exception { + String json = "[\n" + + " {\n" + + " \"pagename\": \"首页\",\n" + + " \"cate\": \"home_page\",\n" + + " \"functions\": [\n" + + " {\n" + + " \"functionname\": \"茶室\",\n" + + " \"type\": \"tea\"\n" + + " },\n" + + " {\n" + + " \"functionname\": \"桌游\",\n" + + " \"type\": \"board\"\n" + + " },\n" + + " {\n" + + " \"functionname\": \"密室\",\n" + + " \"type\": \"escape\"\n" + + " },\n" + + " {\n" + + " \"functionname\": \"剧本杀\",\n" + + " \"type\": \"drama\"\n" + + " },\n" + + " {\n" + + " \"functionname\": \"PS5/switch\",\n" + + " \"type\": \"ps5\"\n" + + " },\n" + + " {\n" + + " \"functionname\": \"电竞\",\n" + + " \"type\": \"game\"\n" + + " },\n" + + " {\n" + + " \"functionname\": \"赛事\",\n" + + " \"type\": \"match\"\n" + + " },\n" + + " {\n" + + " \"functionname\": \"预约\",\n" + + " \"type\": \"book\"\n" + + " },\n" + + " {\n" + + " \"functionname\": \"充值\",\n" + + " \"type\": \"charge\"\n" + + " },\n" + + " {\n" + + " \"functionname\": \"福利中心\",\n" + + " \"type\": \"weal\"\n" + + " }\n" + + " ]\n" + + " },\n" + + " {\n" + + " \"pagename\": \"福利中心\",\n" + + " \"cate\": \"weal_page\",\n" + + " \"functions\": [\n" + + " {\n" + + " \"functionname\": \"卡券套餐\",\n" + + " \"type\": \"card\"\n" + + " },\n" + + " {\n" + + " \"functionname\": \"优惠券\",\n" + + " \"type\": \"coupon\"\n" + + " },\n" + + " {\n" + + " \"functionname\": \"充值\",\n" + + " \"type\": \"charge\"\n" + + " },\n" + + " {\n" + + " \"functionname\": \"团购\",\n" + + " \"type\": \"group\"\n" + + " }\n" + + " ]\n" + + " },\n" + + " {\n" + + " \"pagename\": \"地图找店\",\n" + + " \"cate\": \"map_page\",\n" + + " \"functions\": [\n" + + " {\n" + + " \"functionname\": \"搜索框\",\n" + + " \"type\": \"search\"\n" + + " },\n" + + " {\n" + + " \"functionname\": \"店铺详情\",\n" + + " \"type\": \"site\"\n" + + " },\n" + + " {\n" + + " \"functionname\": \"城市切换\",\n" + + " \"type\": \"city\"\n" + + " }\n" + + " ]\n" + + " },\n" + + " {\n" + + " \"pagename\": \"房间服务\",\n" + + " \"cate\": \"site_page\",\n" + + " \"functions\": [\n" + + " {\n" + + " \"functionname\": \"切换门店\",\n" + + " \"type\": \"venue\"\n" + + " },\n" + + " {\n" + + " \"functionname\": \"确认支付\",\n" + + " \"type\": \"pay\"\n" + + " }\n" + + " ]\n" + + " },\n" + + " {\n" + + " \"pagename\": \"个人中心\",\n" + + " \"cate\": \"personal_page\",\n" + + " \"functions\": [\n" + + " {\n" + + " \"functionname\": \"会员中心\",\n" + + " \"type\": \"vip\"\n" + + " },\n" + + " {\n" + + " \"functionname\": \"余额\",\n" + + " \"type\": \"amount\"\n" + + " },\n" + + " {\n" + + " \"functionname\": \"优惠券\",\n" + + " \"type\": \"coupon\"\n" + + " },\n" + + " {\n" + + " \"functionname\": \"卡券套餐\",\n" + + " \"type\": \"card\"\n" + + " },\n" + + " {\n" + + " \"functionname\": \"积分\",\n" + + " \"type\": \"exp\"\n" + + " }\n" + + " ]\n" + + " }\n" + + "]\n" + + ""; + + List list = null; + list = JsonConvert.root().convertFrom(new TypeToken>() { + }.getType(), json); + Assertions.assertNotNull(list); + Assertions.assertEquals(5, list.size()); + System.out.println("-----------------"); + + list = JsonConvert.root().convertFrom(new TypeToken>() { + }.getType(), ByteBuffer.wrap(json.getBytes(StandardCharsets.UTF_8))); + Assertions.assertNotNull(list); + Assertions.assertEquals(5, list.size()); + System.out.println("-----------------"); + + InputStream in = new ByteArrayInputStream(json.getBytes(StandardCharsets.UTF_8)); + list = JsonConvert.root().convertFrom(new TypeToken>() { + }.getType(), in); + Assertions.assertNotNull(list); + Assertions.assertEquals(5, list.size()); + System.out.println(list); + } + + public static class JsonPvBean { + + @Comment("页面名称") + public String pagename; + + @Comment("页面类别") + public String cate; + + @Comment("页面类别") + public String code; + + @Comment("页面功能点") + public List functions; + + @Override + public String toString() { + return "{\"pagename\":\"" + pagename + "\",\"cate\":\"" + cate + "\",\"code\":\"" + code + "\",\"functions\":" + functions + "}"; + } + + public static class Functions { + + @Comment("功能名称") + public String functionname; + + @Comment("功能类型") + public String type; + + @Override + public String toString() { + return "{\"functionname\":\"" + functionname + "\",\"type\":\"" + type + "\"}"; + } + } + } +}