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