This is an automated email from the ASF dual-hosted git repository. rmannibucau pushed a commit to branch master in repository https://gitbox.apache.org/repos/asf/johnzon.git
commit 542765dd97f02910bb78d745632aef3fd9dd5582 Author: leadpony <[email protected]> AuthorDate: Tue Apr 23 06:14:10 2019 +0900 Make it less impacting to performance --- .../org/apache/johnzon/core/JsonObjectImpl.java | 4 +- .../main/java/org/apache/johnzon/core/Strings.java | 85 ++++++++++++---------- 2 files changed, 49 insertions(+), 40 deletions(-) diff --git a/johnzon-core/src/main/java/org/apache/johnzon/core/JsonObjectImpl.java b/johnzon-core/src/main/java/org/apache/johnzon/core/JsonObjectImpl.java index 5444fc6..a70c410 100644 --- a/johnzon-core/src/main/java/org/apache/johnzon/core/JsonObjectImpl.java +++ b/johnzon-core/src/main/java/org/apache/johnzon/core/JsonObjectImpl.java @@ -147,7 +147,9 @@ final class JsonObjectImpl extends AbstractMap<String, JsonValue> implements Jso while (hasNext) { final Map.Entry<String, JsonValue> entry = it.next(); - builder.append('"').append(Strings.escape(entry.getKey())).append("\":"); + builder.append('"'); + Strings.appendEscaped(entry.getKey(), builder); + builder.append("\":"); final JsonValue value = entry.getValue(); if (JsonString.class.isInstance(value)) { diff --git a/johnzon-core/src/main/java/org/apache/johnzon/core/Strings.java b/johnzon-core/src/main/java/org/apache/johnzon/core/Strings.java index 412f6ef..cbcf509 100644 --- a/johnzon-core/src/main/java/org/apache/johnzon/core/Strings.java +++ b/johnzon-core/src/main/java/org/apache/johnzon/core/Strings.java @@ -47,9 +47,9 @@ class Strings implements JsonChars { case '"': return '\"'; case '\\': - return '\\'; + return '\\'; case '/': - return '/'; + return '/'; default: if(Character.isHighSurrogate(current) || Character.isLowSurrogate(current)) { return current; @@ -61,54 +61,61 @@ class Strings implements JsonChars { } static String escape(final String value) { - + if(value == null || value.length()==0) { return value; } - + final StringBuilder builder = BUILDER_CACHE.newBuffer(); try { - for (int i = 0; i < value.length(); i++) { - final char c = value.charAt(i); - switch (c) { - case QUOTE_CHAR: - case ESCAPE_CHAR: - builder.append(ESCAPE_CHAR).append(c); - break; - default: - if (c < SPACE) { // we could do a single switch but actually we should rarely enter this if so no need to pay it - switch (c) { - case EOL: - builder.append("\\n"); - break; - case '\r': - builder.append("\\r"); - break; - case '\t': - builder.append("\\t"); - break; - case '\b': - builder.append("\\b"); - break; - case '\f': - builder.append("\\f"); - break; - default: - builder.append(toUnicode(c)); - } - } else if ((c >= '\u0080' && c < '\u00a0') || (c >= '\u2000' && c < '\u2100')) { - builder.append(toUnicode(c)); - } else { - builder.append(c); - } - } - } + appendEscaped(value, builder); return builder.toString(); } finally { BUILDER_CACHE.release(builder); } } + static void appendEscaped(final String value, final StringBuilder builder) { + final int length = value.length(); + int nextStart = 0; + for (int i = 0; i < length; i++) { + final char c = value.charAt(i); + if (c < SPACE || c == QUOTE_CHAR || c == ESCAPE_CHAR) { + if (nextStart < i) { + builder.append(value, nextStart, i); + } + nextStart = i + 1; + switch (c) { + case QUOTE_CHAR: + case ESCAPE_CHAR: + builder.append(ESCAPE_CHAR).append(c); + break; + case EOL: + builder.append("\\n"); + break; + case '\r': + builder.append("\\r"); + break; + case '\t': + builder.append("\\t"); + break; + case '\b': + builder.append("\\b"); + break; + case '\f': + builder.append("\\f"); + break; + default: + builder.append(toUnicode(c)); + break; + } + } + } + if (nextStart < length) { + builder.append(value, nextStart, length); + } + } + private static String toUnicode(final char c) { final String found = UNICODE_CACHE.get(c); if (found != null) {
