From 1d52cc5acf5447eff4d19b9a040272714d2dbf88 Mon Sep 17 00:00:00 2001 From: redkale Date: Sat, 12 Aug 2023 22:05:20 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BF=AE=E5=A4=8DStringWrapper=E5=BA=8F?= =?UTF-8?q?=E5=88=97=E5=8C=96json=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../convert/json/JsonByteBufferWriter.java | 14 ++++++-- .../redkale/convert/json/JsonBytesWriter.java | 36 +++++++++++++++++++ .../org/redkale/convert/json/JsonWriter.java | 6 ---- 3 files changed, 48 insertions(+), 8 deletions(-) diff --git a/src/main/java/org/redkale/convert/json/JsonByteBufferWriter.java b/src/main/java/org/redkale/convert/json/JsonByteBufferWriter.java index fb83f04af..6d67fa48e 100644 --- a/src/main/java/org/redkale/convert/json/JsonByteBufferWriter.java +++ b/src/main/java/org/redkale/convert/json/JsonByteBufferWriter.java @@ -10,7 +10,7 @@ import java.nio.charset.Charset; import java.util.Objects; import java.util.function.Supplier; import org.redkale.convert.ConvertException; -import org.redkale.util.Utility; +import org.redkale.util.*; /** * 以ByteBuffer为数据载体的JsonWriter @@ -787,7 +787,7 @@ public class JsonByteBufferWriter extends JsonWriter { } } if (len == chs.length) { - writeTo(-1, true, chs, 0, len); + writeTo(-1, quote, chs, 0, len); return; } int expandsize = -1; @@ -860,6 +860,16 @@ public class JsonByteBufferWriter extends JsonWriter { writeTo(expandsize, quote, cs, 0, sb.length()); } + @Override + public void writeWrapper(StringWrapper wrapper) { + if (wrapper == null || wrapper.getValue() == null) { + writeNull(); + return; + } + final char[] chs = Utility.charArray(wrapper.getValue()); + writeTo(-1, false, chs, 0, chs.length); + } + @Override public String toString() { return Objects.toString(this); diff --git a/src/main/java/org/redkale/convert/json/JsonBytesWriter.java b/src/main/java/org/redkale/convert/json/JsonBytesWriter.java index c788e63f6..33382e2a2 100644 --- a/src/main/java/org/redkale/convert/json/JsonBytesWriter.java +++ b/src/main/java/org/redkale/convert/json/JsonBytesWriter.java @@ -490,6 +490,42 @@ public class JsonBytesWriter extends JsonWriter implements ByteTuple { count = curr; } + @Override + public void writeWrapper(StringWrapper wrapper) { + if (wrapper == null || wrapper.getValue() == null) { + writeNull(); + return; + } + String value = wrapper.getValue(); + if (Utility.isLatin1(value)) { + writeTo(Utility.latin1ByteArray(value)); + return; + } + byte[] bytes = expand(value.length() * 4 + 2); + int curr = count; + int len = value.length(); + for (int i = 0; i < len; i++) { + char ch = value.charAt(i); + if (ch < 0x80) { + bytes[curr++] = (byte) ch; + } else if (ch < 0x800) { + bytes[curr++] = (byte) (0xc0 | (ch >> 6)); + bytes[curr++] = (byte) (0x80 | (ch & 0x3f)); + } else if (Character.isSurrogate(ch)) { //连取两个 + int uc = Character.toCodePoint(ch, value.charAt(++i)); + bytes[curr++] = (byte) (0xf0 | ((uc >> 18))); + bytes[curr++] = (byte) (0x80 | ((uc >> 12) & 0x3f)); + bytes[curr++] = (byte) (0x80 | ((uc >> 6) & 0x3f)); + bytes[curr++] = (byte) (0x80 | (uc & 0x3f)); + } else { + bytes[curr++] = (byte) (0xe0 | ((ch >> 12))); + bytes[curr++] = (byte) (0x80 | ((ch >> 6) & 0x3f)); + bytes[curr++] = (byte) (0x80 | (ch & 0x3f)); + } + } + count = curr; + } + @Override public String toString() { return new String(content, 0, count, StandardCharsets.UTF_8); diff --git a/src/main/java/org/redkale/convert/json/JsonWriter.java b/src/main/java/org/redkale/convert/json/JsonWriter.java index 6e54415ac..fb8136632 100644 --- a/src/main/java/org/redkale/convert/json/JsonWriter.java +++ b/src/main/java/org/redkale/convert/json/JsonWriter.java @@ -7,7 +7,6 @@ package org.redkale.convert.json; import java.lang.reflect.Type; import org.redkale.convert.*; -import org.redkale.util.StringWrapper; /** * @@ -172,11 +171,6 @@ public abstract class JsonWriter extends Writer { writeLatin1To(false, String.valueOf(value)); } - @Override - public final void writeWrapper(StringWrapper value) { - writeString(false, String.valueOf(value)); - } - @Override public final boolean needWriteClassName() { return false;