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:36 UTC

[johnzon] branch master updated (c22aaba -> 542765d)

This is an automated email from the ASF dual-hosted git repository.

rmannibucau pushed a change to branch master
in repository https://gitbox.apache.org/repos/asf/johnzon.git.


    from c22aaba  JOHNZON-208 ensure writeKey().write() pattern is valid in generator
     new 4475ccc  Fix JsonObject#toString() to escape key names.
     new 542765d  Make it less impacting to performance

The 2 revisions listed above as "new" are entirely new to this
repository and will be described in separate emails.  The revisions
listed as "add" were already present in the repository and have only
been added to this reference.


Summary of changes:
 .../org/apache/johnzon/core/JsonObjectImpl.java    |  4 +-
 .../main/java/org/apache/johnzon/core/Strings.java | 85 ++++++++++++----------
 .../apache/johnzon/core/JsonObjectImplTest.java    | 13 ++++
 3 files changed, 62 insertions(+), 40 deletions(-)


[johnzon] 02/02: Make it less impacting to performance

Posted by rm...@apache.org.
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) {


[johnzon] 01/02: Fix JsonObject#toString() to escape key names.

Posted by rm...@apache.org.
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 4475cccf57f6a1b98f0262bc15ebe952b5fc4ada
Author: leadpony <de...@leadpony.org>
AuthorDate: Sat Apr 20 23:35:49 2019 +0900

    Fix JsonObject#toString() to escape key names.
---
 .../main/java/org/apache/johnzon/core/JsonObjectImpl.java   |  2 +-
 .../java/org/apache/johnzon/core/JsonObjectImplTest.java    | 13 +++++++++++++
 2 files changed, 14 insertions(+), 1 deletion(-)

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 a260e25..5444fc6 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,7 @@ final class JsonObjectImpl extends AbstractMap<String, JsonValue> implements Jso
         while (hasNext) {
             final Map.Entry<String, JsonValue> entry = it.next();
 
-            builder.append('"').append(entry.getKey()).append("\":");
+            builder.append('"').append(Strings.escape(entry.getKey())).append("\":");
 
             final JsonValue value = entry.getValue();
             if (JsonString.class.isInstance(value)) {
diff --git a/johnzon-core/src/test/java/org/apache/johnzon/core/JsonObjectImplTest.java b/johnzon-core/src/test/java/org/apache/johnzon/core/JsonObjectImplTest.java
index 2e418e6..e3841d0 100644
--- a/johnzon-core/src/test/java/org/apache/johnzon/core/JsonObjectImplTest.java
+++ b/johnzon-core/src/test/java/org/apache/johnzon/core/JsonObjectImplTest.java
@@ -75,6 +75,19 @@ public class JsonObjectImplTest {
         assertEquals("{\"a\":\"b\"}", ob.build().toString());
     }
 
+    @Test
+    public void testToStringShouldReturnEscapedKey() {
+        final JsonObjectBuilder ob = Json.createObjectBuilder();
+        ob.add("foo\"bar", new JsonLongImpl(42));
+        assertEquals("{\"foo\\\"bar\":42}", ob.build().toString());
+    }
+
+    @Test
+    public void testToStringShouldReturnEscapedValue() {
+        final JsonObjectBuilder ob = Json.createObjectBuilder();
+        ob.add("a", new JsonStringImpl("foo\"bar"));
+        assertEquals("{\"a\":\"foo\\\"bar\"}", ob.build().toString());
+    }
 
     @Test(expected = NullPointerException.class)
     public void testGetBooleanMissingKeyShouldThrowNullPointerException() {