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) {