You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@johnzon.apache.org by rm...@apache.org on 2019/04/29 08:25:38 UTC
[johnzon] 02/02: Make it less impacting to performance
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 <de...@leadpony.org>
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) {