Bug 2147 - JSON does not properly encode multiline string
[yangtools.git] / yang / yang-data-codec-gson / src / main / java / org / opendaylight / yangtools / yang / data / codec / gson / JSONNormalizedNodeStreamWriter.java
index 8fcc596ab47ebe3e8e5d2ed86ecb00f8cc2d104e..e1bba78be001caa2977611544256ff23e5ffd510 100644 (file)
@@ -11,9 +11,6 @@ import com.google.common.base.CharMatcher;
 import com.google.common.base.Preconditions;
 import com.google.common.base.Strings;
 import com.google.gson.stream.JsonWriter;
-import java.io.IOException;
-import java.io.Writer;
-import java.net.URI;
 import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier.AugmentationIdentifier;
 import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier.NodeIdentifier;
 import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier.NodeIdentifierWithPredicates;
@@ -26,6 +23,10 @@ import org.opendaylight.yangtools.yang.model.api.LeafSchemaNode;
 import org.opendaylight.yangtools.yang.model.api.SchemaContext;
 import org.opendaylight.yangtools.yang.model.api.SchemaPath;
 
+import java.io.IOException;
+import java.io.Writer;
+import java.net.URI;
+
 /**
  * This implementation will create JSON output as output stream.
  *
@@ -43,7 +44,7 @@ public class JSONNormalizedNodeStreamWriter implements NormalizedNodeStreamWrite
     /**
      * Matcher used to check if a string needs to be escaped.
      */
-    private static final CharMatcher QUOTES_OR_BACKSLASH = CharMatcher.anyOf("\\\"");
+    private static final CharMatcher JSON_ILLEGAL_STRING_CHARACTERS = CharMatcher.anyOf("\\\"\n\r");
 
     private final SchemaTracker tracker;
     private final JSONCodecFactory codecs;
@@ -228,14 +229,14 @@ public class JSONNormalizedNodeStreamWriter implements NormalizedNodeStreamWrite
         if (needQuotes) {
             writer.append('"');
 
-            final int needEscape = QUOTES_OR_BACKSLASH.countIn(str);
+            final int needEscape = JSON_ILLEGAL_STRING_CHARACTERS.countIn(str);
             if (needEscape != 0) {
                 final char[] escaped = new char[str.length() + needEscape];
                 int offset = 0;
 
                 for (int i = 0; i < str.length(); i++) {
                     final char c = str.charAt(i);
-                    if (QUOTES_OR_BACKSLASH.matches(c)) {
+                    if (JSON_ILLEGAL_STRING_CHARACTERS.matches(c)) {
                         escaped[offset++] = '\\';
                     }
                     escaped[offset++] = c;