From 66b4da6c94e816d1a41c72dcfd6e61105728acd2 Mon Sep 17 00:00:00 2001 From: salyh Date: Sat, 12 Jul 2014 01:50:41 +0200 Subject: [PATCH 10/14] fixed escaping problems when writing string in array Signed-off-by: salyh --- .../org/apache/fleece/core/JsonGeneratorImpl.java | 4 +- .../apache/fleece/core/JsonGeneratorImplTest.java | 56 ++++++++++++++++++++-- 2 files changed, 55 insertions(+), 5 deletions(-) diff --git a/fleece-core/src/main/java/org/apache/fleece/core/JsonGeneratorImpl.java b/fleece-core/src/main/java/org/apache/fleece/core/JsonGeneratorImpl.java index 02f46da..f36166f 100644 --- a/fleece-core/src/main/java/org/apache/fleece/core/JsonGeneratorImpl.java +++ b/fleece-core/src/main/java/org/apache/fleece/core/JsonGeneratorImpl.java @@ -1,5 +1,5 @@ /* - * Licensed to the Apache Software Foundation (ASF) under one +esc * Licensed to the Apache Software Foundation (ASF) under one * or more contributor license agreements. See the NOTICE file * distributed with this work for additional information * regarding copyright ownership. The ASF licenses this file @@ -200,7 +200,7 @@ public class JsonGeneratorImpl

> implements JsonGe @Override public JsonGenerator write(final String value) { checkArray(); - noCheckWriteAndForceComma(value); + noCheckWriteAndForceComma(QUOTE+Strings.escape(value)+QUOTE); return this; } diff --git a/fleece-core/src/test/java/org/apache/fleece/core/JsonGeneratorImplTest.java b/fleece-core/src/test/java/org/apache/fleece/core/JsonGeneratorImplTest.java index e66e62d..601eeba 100644 --- a/fleece-core/src/test/java/org/apache/fleece/core/JsonGeneratorImplTest.java +++ b/fleece-core/src/test/java/org/apache/fleece/core/JsonGeneratorImplTest.java @@ -21,7 +21,9 @@ package org.apache.fleece.core; import org.junit.Test; import javax.json.Json; +import javax.json.JsonValue; import javax.json.stream.JsonGenerator; + import java.io.ByteArrayOutputStream; import java.util.HashMap; @@ -54,15 +56,58 @@ public class JsonGeneratorImplTest { Json.createGenerator(baos).writeStartArray().write(1).write(2).writeEnd().close(); assertEquals("[1,2]", new String(baos.toByteArray())); } + + @Test + public void stringArray() { + final ByteArrayOutputStream baos = new ByteArrayOutputStream(); + Json.createGenerator(baos).writeStartArray().write("val1").write("val2").writeEnd().close(); + assertEquals("[\"val1\",\"val2\"]", new String(baos.toByteArray())); + } + + @Test + public void stringArrayEscapes() { + final ByteArrayOutputStream baos = new ByteArrayOutputStream(); + Json.createGenerator(baos).writeStartArray().write("\"val1\t\u0080").write("val2\\").writeEnd().close(); + assertEquals("[\"\\\"val1\\t\\u0080\",\"val2\\\\\"]", new String(baos.toByteArray())); + } + + @Test + public void emptyStringArray() { + final ByteArrayOutputStream baos = new ByteArrayOutputStream(); + Json.createGenerator(baos).writeStartArray().writeNull().write("").writeEnd().close(); + assertEquals("[null,\"\"]", new String(baos.toByteArray())); + } + + //wait for FLEECE-7 + /*@Test + public void nullLiteralArray() { + final ByteArrayOutputStream baos = new ByteArrayOutputStream(); + Json.createGenerator(baos).writeStartArray().writeNull().write(JsonValue.NULL).writeEnd().close(); + assertEquals("[null,null]", new String(baos.toByteArray())); + }*/ + + @Test + public void boolLiteralArray() { + final ByteArrayOutputStream baos = new ByteArrayOutputStream(); + Json.createGenerator(baos).writeStartArray().write(JsonValue.FALSE).write(JsonValue.TRUE).writeEnd().close(); + assertEquals("[false,true]", new String(baos.toByteArray())); + } @Test public void generate() { final ByteArrayOutputStream baos = new ByteArrayOutputStream(); final JsonGenerator generator = Json.createGenerator(baos); - generator.writeStartObject().write("firstName", "John").write("lastName", "Smith").write("age", 25).writeStartObject("address").write("streetAddress", "21 2nd Street").write("city", "New York").write("state", "NY").write("postalCode", "10021").writeEnd().writeStartArray("phoneNumber").writeStartObject().write("type", "home").write("number", "212 555-1234").writeEnd().writeStartObject().write("type", "fax").write("number", "646 555-4567").writeEnd().writeEnd().writeEnd().close(); + generator.writeStartObject().write("firstName", "John").write("lastName", "Smith").write("age", 25) + .writeStartObject("address").write("streetAddress", "21 2nd Street").write("city", "New York") + .write("state", "NY").write("postalCode", "10021").writeEnd().writeStartArray("phoneNumber") + .writeStartObject().write("type", "home").write("number", "212 555-1234").writeEnd().writeStartObject() + .write("type", "fax").write("number", "646 555-4567").writeEnd().writeEnd().writeEnd().close(); - assertEquals("{\"firstName\":\"John\",\"lastName\":\"Smith\",\"age\":25,\"address\":{\"streetAddress\":\"21 2nd Street\",\"city\":\"New York\",\"state\":\"NY\",\"postalCode\":\"10021\"},\"phoneNumber\":[{\"type\":\"home\",\"number\":\"212 555-1234\"},{\"type\":\"fax\",\"number\":\"646 555-4567\"}]}", new String(baos.toByteArray())); + assertEquals("{\"firstName\":\"John\",\"lastName\":\"Smith\",\"age\":25,\"address\":" + + "{\"streetAddress\":\"21 2nd Street\",\"city\":\"New York\",\"state\":\"NY\",\"postalCode\":\"10021\"}," + + "\"phoneNumber\":[{\"type\":\"home\",\"number\":\"212 555-1234\"},{\"type\":\"fax\",\"number\":\"646 555-4567\"}]}", + new String(baos.toByteArray())); } @Test @@ -72,7 +117,12 @@ public class JsonGeneratorImplTest { put(JsonGenerator.PRETTY_PRINTING, true); }}).createGenerator(baos); - generator.writeStartObject().write("firstName", "John").write("lastName", "Smith").write("age", 25).writeStartObject("address").write("streetAddress", "21 2nd Street").write("city", "New York").write("state", "NY").write("postalCode", "10021").writeEnd().writeStartArray("phoneNumber").writeStartObject().write("type", "home").write("number", "212 555-1234").writeEnd().writeStartObject().write("type", "fax").write("number", "646 555-4567").writeEnd().writeEnd().writeEnd().close(); + generator.writeStartObject().write("firstName", "John").write("lastName", "Smith") + .write("age", 25).writeStartObject("address").write("streetAddress", "21 2nd Street") + .write("city", "New York").write("state", "NY").write("postalCode", "10021").writeEnd() + .writeStartArray("phoneNumber").writeStartObject().write("type", "home").write("number", "212 555-1234") + .writeEnd().writeStartObject().write("type", "fax").write("number", "646 555-4567").writeEnd().writeEnd() + .writeEnd().close(); assertEquals("{\n" + " \"firstName\":\"John\",\n" + -- 1.8.5.2 (Apple Git-48)