From 090bfb56296e34745f637454db1961ca2aae5b33 Mon Sep 17 00:00:00 2001 From: redkale Date: Sun, 29 Sep 2024 09:34:33 +0800 Subject: [PATCH] convert --- .../convert/json/JsonByteBufferReader.java | 63 +++++----- .../org/redkale/convert/json/JsonReader.java | 109 +++++++++--------- 2 files changed, 90 insertions(+), 82 deletions(-) diff --git a/src/main/java/org/redkale/convert/json/JsonByteBufferReader.java b/src/main/java/org/redkale/convert/json/JsonByteBufferReader.java index eb1ff9f5d..295c38fdb 100644 --- a/src/main/java/org/redkale/convert/json/JsonByteBufferReader.java +++ b/src/main/java/org/redkale/convert/json/JsonByteBufferReader.java @@ -69,7 +69,7 @@ public class JsonByteBufferReader extends JsonReader { return nextChar(null); } - protected final char nextChar(StringBuilder sb) { + protected final char nextChar(CharArray sb) { if (currentChar != 0) { char ch = currentChar; this.currentChar = 0; @@ -496,38 +496,38 @@ public class JsonByteBufferReader extends JsonReader { if (ch == 0) { return null; } - final StringBuilder sb = new StringBuilder(); + final CharArray tmp = array(); if (ch == '"' || ch == '\'') { final char quote = ch; for (; ; ) { - ch = nextChar(sb); + ch = nextChar(tmp); if (ch == '\\') { - char c = nextChar(sb); + char c = nextChar(tmp); switch (c) { case '"': case '\'': case '\\': case '/': - sb.append(c); + tmp.append(c); break; case 'n': - sb.append('\n'); + tmp.append('\n'); break; case 'r': - sb.append('\r'); + tmp.append('\r'); break; case 'u': - sb.append((char) Integer.parseInt( + tmp.append((char) Integer.parseInt( new String(new char[] {nextChar(), nextChar(), nextChar(), nextChar()}), 16)); break; case 't': - sb.append('\t'); + tmp.append('\t'); break; case 'b': - sb.append('\b'); + tmp.append('\b'); break; case 'f': - sb.append('\f'); + tmp.append('\f'); break; default: throw new ConvertException("illegal escape(" + c + ") (position = " + this.position + ")"); @@ -535,41 +535,44 @@ public class JsonByteBufferReader extends JsonReader { } else if (ch == quote || ch == 0) { break; } else { - sb.append(ch); + tmp.append(ch); } } - return sb.toString(); + return tmp.toStringThenClear(); } else { - sb.append(ch); + tmp.append(ch); for (; ; ) { - ch = nextChar(sb); + ch = nextChar(tmp); if (ch == '\\') { - char c = nextChar(sb); + char c = nextChar(tmp); switch (c) { case '"': case '\'': case '\\': case '/': - sb.append(c); + tmp.append(c); break; case 'n': - sb.append('\n'); + tmp.append('\n'); break; case 'r': - sb.append('\r'); + tmp.append('\r'); break; case 'u': - sb.append((char) Integer.parseInt( - new String(new char[] {nextChar(), nextChar(), nextChar(), nextChar()}), 16)); + int hex = (Character.digit(nextChar(), 16) << 12) + + (Character.digit(nextChar(), 16) << 8) + + (Character.digit(nextChar(), 16) << 4) + + Character.digit(nextChar(), 16); + tmp.append((char) hex); break; case 't': - sb.append('\t'); + tmp.append('\t'); break; case 'b': - sb.append('\b'); + tmp.append('\b'); break; case 'f': - sb.append('\f'); + tmp.append('\f'); break; default: throw new ConvertException("illegal escape(" + c + ") (position = " + this.position + ")"); @@ -578,10 +581,10 @@ public class JsonByteBufferReader extends JsonReader { backChar(ch); break; } else { - sb.append(ch); + tmp.append(ch); } } - String rs = sb.toString(); + String rs = tmp.toStringThenClear(); return "null".equalsIgnoreCase(rs) ? null : rs; } } @@ -593,22 +596,23 @@ public class JsonByteBufferReader extends JsonReader { return null; } DeMemberNode node = memberInfo.getMemberNode(); - StringBuilder sb = new StringBuilder(); + CharArray tmp = array(); if (ch == '"' || ch == '\'') { final char quote = ch; for (; ; ) { - ch = nextChar(sb); + ch = nextChar(tmp); if (ch == quote || ch == 0) { break; } else { node = node == null ? null : node.getNode(ch); } } + tmp.clear(); return node == null ? null : node.getValue(); } else { node = node == null ? null : node.getNode(ch); for (; ; ) { - ch = nextChar(sb); + ch = nextChar(tmp); if (ch == ',' || ch == ']' || ch == '}' || ch <= ' ' || ch == ':') { // ch <= ' ' 包含 0 backChar(ch); break; @@ -616,6 +620,7 @@ public class JsonByteBufferReader extends JsonReader { node = node == null ? null : node.getNode(ch); } } + tmp.clear(); return node == null ? null : node.getValue(); } } diff --git a/src/main/java/org/redkale/convert/json/JsonReader.java b/src/main/java/org/redkale/convert/json/JsonReader.java index e2429b288..9501a9bdb 100644 --- a/src/main/java/org/redkale/convert/json/JsonReader.java +++ b/src/main/java/org/redkale/convert/json/JsonReader.java @@ -865,13 +865,67 @@ public class JsonReader extends Reader { final int end = limit; char quote = nextGoodChar(true); int curr = this.position; - if (quote != '"' && quote != '\'') { + if (quote == '"' || quote == '\'') { + final int start = ++curr; + CharArray tmp = null; + char c; + for (; curr <= end; curr++) { + char ch = text0[curr]; + if (ch == quote) { + break; + } else if (ch == '\\') { + if (tmp == null) { + tmp = array(); + tmp.append(text0, start, curr - start); + } + c = text0[++curr]; + switch (c) { + case '"': + case '\'': + case '\\': + case '/': + tmp.append(c); + break; + case 'n': + tmp.append('\n'); + break; + case 'r': + tmp.append('\r'); + break; + case 'u': + int hex = (Character.digit(text0[++curr], 16) << 12) + + (Character.digit(text0[++curr], 16) << 8) + + (Character.digit(text0[++curr], 16) << 4) + + Character.digit(text0[++curr], 16); + tmp.append((char) hex); + break; + case 't': + tmp.append('\t'); + break; + case 'b': + tmp.append('\b'); + break; + case 'f': + tmp.append('\f'); + break; + default: + this.position = curr; + throw new ConvertException("illegal escape(" + c + ") (position = " + this.position + + ") in " + new String(this.text)); + } + } else if (tmp != null) { + tmp.append(ch); + } + } + this.position = curr; + return tmp != null ? tmp.toStringThenClear() : new String(text0, start, curr - start); + } else { // 不带双引号 final int start = curr; if (quote == 'n' && end >= curr + 3 && text0[1 + curr] == 'u' && text0[2 + curr] == 'l' - && text0[3 + curr] == 'l') { + && text0[3 + curr] == 'l') { // 为null或者null开头的字符串 curr += 3; this.position = curr; if (curr < end) { @@ -915,57 +969,6 @@ public class JsonReader extends Reader { return new String(text0, start, curr - start); } } - final int start = ++curr; - CharArray array = null; - char c; - for (; curr <= end; curr++) { - char ch = text0[curr]; - if (ch == quote) { - break; - } else if (ch == '\\') { - if (array == null) { - array = array(); - array.append(text0, start, curr - start); - } - c = text0[++curr]; - switch (c) { - case '"': - case '\'': - case '\\': - case '/': - array.append(c); - break; - case 'n': - array.append('\n'); - break; - case 'r': - array.append('\r'); - break; - case 'u': - array.append((char) Integer.parseInt( - new String(new char[] {text0[++curr], text0[++curr], text0[++curr], text0[++curr]}), - 16)); - break; - case 't': - array.append('\t'); - break; - case 'b': - array.append('\b'); - break; - case 'f': - array.append('\f'); - break; - default: - this.position = curr; - throw new ConvertException("illegal escape(" + c + ") (position = " + this.position + ") in " - + new String(this.text)); - } - } else if (array != null) { - array.append(ch); - } - } - this.position = curr; - return array != null ? array.toStringThenClear() : new String(text0, start, curr - start); } private String readEscapeValue(final char expected, int start) {