Index: src/test/com/thoughtworks/xstream/io/json/JsonHierarchicalStreamDriverTest.java
===================================================================
--- src/test/com/thoughtworks/xstream/io/json/JsonHierarchicalStreamDriverTest.java	(revision 1195)
+++ src/test/com/thoughtworks/xstream/io/json/JsonHierarchicalStreamDriverTest.java	(working copy)
@@ -21,6 +21,18 @@
  */
 public class JsonHierarchicalStreamDriverTest extends TestCase {
 
+    final static String toBeEscapedChars;
+
+    static {
+        StringBuilder sb = new StringBuilder();
+        for (int i = 0; ((char)i) < ' '; ++i) {
+            sb.append((char) i);
+        }
+        sb.append('\\');
+        sb.append('"');
+        toBeEscapedChars = sb.toString();
+    }
+
     public void testReadingFromReaderNotSupported() {
         try {
             new JsonHierarchicalStreamDriver().createReader((Reader) null);
@@ -413,5 +425,23 @@
         holder.map.put("one", new Integer(1));
         assertEquals(expected, xs.toXML(holder));
     }
+
+    final static class StringHolder {
+        String fieldNamedByToBeEscaped\u0000Chars;
+    }
+
+    public void testJsonEscaping() {
+        XStream xs = new XStream(new JsonHierarchicalStreamDriver());
+        xs.alias("holder", StringHolder.class);
+        String expected = (""
+            + "{'holder': {\n"
+            + "  'fieldNamedByToBeEscaped\\u0000Chars': 'aBc_\\u0000\\u0001\\u0002\\u0003\\u0004\\u0005\\u0006\\u0007\\b\\t\\n"
+            +        "\\u000b\\f\\r\\u000e\\u000f\\u0010\\u0011\\u0012\\u0013\\u0014\\u0015\\u0016\\u0017\\u0018\\u0019"
+            +        "\\u001a\\u001b\\u001c\\u001d\\u001e\\u001f\\\\\\'_aBc'\n"
+            + "}}").replace('\'', '"');
+        StringHolder holder = new StringHolder();
+        holder.fieldNamedByToBeEscaped\u0000Chars = "aBc_" + toBeEscapedChars + "_aBc";
+        assertEquals(expected, xs.toXML(holder));
 }
 
+}
Index: src/test/com/thoughtworks/xstream/io/json/JettisonMappedXmlDriverTest.java
===================================================================
--- src/test/com/thoughtworks/xstream/io/json/JettisonMappedXmlDriverTest.java	(revision 1195)
+++ src/test/com/thoughtworks/xstream/io/json/JettisonMappedXmlDriverTest.java	(working copy)
@@ -7,7 +7,6 @@
 import com.thoughtworks.acceptance.objects.Category;
 import com.thoughtworks.acceptance.objects.Product;
 import com.thoughtworks.xstream.XStream;
-import com.thoughtworks.xstream.io.json.JettisonMappedXmlDriver;
 
 
 /**
@@ -17,6 +16,18 @@
  */
 public class JettisonMappedXmlDriverTest extends TestCase {
 
+    final static String toBeEscapedChars;
+
+    static {
+        StringBuilder sb = new StringBuilder();
+        for (int i = 0; ((char)i) < ' '; ++i) {
+            sb.append((char) i);
+        }
+        sb.append('\\');
+        sb.append('"');
+        toBeEscapedChars = sb.toString();
+    }
+
     private String simpleJson = "{\"com.thoughtworks.acceptance.objects.Product\":{\"name\":\"Banana\",\"id\":\"123\",\"price\":\"23.0\"}}";
     private String hiearchyJson = "{\"category\":{\"name\":\"fruit\",\"id\":\"111\",\"products\":{\"product\":[{\"name\":\"Banana\",\"id\":\"123\",\"price\":\"23.0\",\"tags\":{\"string\":[\"yellow\",\"fresh\",\"tasty\"]}},{\"name\":\"Mango\",\"id\":\"124\",\"price\":\"34.0\"}]}}}";
 
@@ -72,4 +83,22 @@
         assertEquals(parsedBanana.getTags().get(2), "tasty");
     }
 
+    final static class StringHolder {
+        String fieldNamedByToBeEscaped\u0000Chars;
+    }
+
+    public void testJsonEscaping() {
+        XStream xs = new XStream(new JettisonMappedXmlDriver());
+        xs.alias("holder", StringHolder.class);
+        String expected = (""
+            + "{'holder':{"
+            + "'fieldNamedByToBeEscaped\\u0000Chars':'aBc_\\u0000\\u0001\\u0002\\u0003\\u0004\\u0005\\u0006\\u0007\\b\\t\\n"
+            +        "\\u000b\\f\\r\\u000e\\u000f\\u0010\\u0011\\u0012\\u0013\\u0014\\u0015\\u0016\\u0017\\u0018\\u0019"
+            +        "\\u001a\\u001b\\u001c\\u001d\\u001e\\u001f\\\\\\'_aBc'"
+            + "}}").replace('\'', '"');
+        StringHolder holder = new StringHolder();
+        holder.fieldNamedByToBeEscaped\u0000Chars = "aBc_" + toBeEscapedChars + "_aBc";
+        assertEquals(expected, xs.toXML(holder));
+    }
+
 }
Index: src/java/com/thoughtworks/xstream/io/json/JsonHierarchicalStreamWriter.java
===================================================================
--- src/java/com/thoughtworks/xstream/io/json/JsonHierarchicalStreamWriter.java	(revision 1195)
+++ src/java/com/thoughtworks/xstream/io/json/JsonHierarchicalStreamWriter.java	(working copy)
@@ -1,24 +1,26 @@
 package com.thoughtworks.xstream.io.json;
 
+import java.io.Writer;
+import java.util.Collection;
+
 import com.thoughtworks.xstream.core.util.FastStack;
 import com.thoughtworks.xstream.core.util.QuickWriter;
-import com.thoughtworks.xstream.io.HierarchicalStreamWriter;
 import com.thoughtworks.xstream.io.ExtendedHierarchicalStreamWriter;
-
-import java.io.Writer;
-import java.util.Collection;
+import com.thoughtworks.xstream.io.HierarchicalStreamWriter;
 
 /**
  * A simple writer that outputs JSON in a pretty-printed indented stream.
  * Arrays, Lists and Sets rely on you NOT using XStream.addImplicitCollection(..)
  *
  * @author Paul Hammant
+ * @author Stefan Fleiter
  * @since 1.2
  */
 public class JsonHierarchicalStreamWriter implements ExtendedHierarchicalStreamWriter {
 
     private final QuickWriter writer;
     private final FastStack elementStack = new FastStack(16);
+    private final JsonEscapeUtils jsonEscapeUtils = new JsonEscapeUtils();
     private final char[] lineIndenter;
 
     private int depth;
@@ -26,7 +28,6 @@
     private boolean tagIsEmpty;
     private String newLine;
 
-
     public JsonHierarchicalStreamWriter(Writer writer, char[] lineIndenter, String newLine) {
         this.writer = new QuickWriter(writer);
         this.lineIndenter = lineIndenter;
@@ -73,7 +74,7 @@
                         && Collection.class.isAssignableFrom(currNode.clazz) == false 
                         && currNode.clazz.isArray() == false)) {
             writer.write("\"");
-            writer.write(name);
+            jsonEscapeUtils.escape(name, writer);
             writer.write("\": ");
         }
         if (clazz != null &&
@@ -113,7 +114,7 @@
         writer.write(key);
         writer.write("\" :");
         writeAttributeValue(writer, value);
-        writer.write('\"');
+        writer.write('"');
     }
 
     protected void writeAttributeValue(QuickWriter writer, String text) {
@@ -130,29 +131,7 @@
         if (needsQuotes(clazz)) {
             writer.write("\"");
         }
-
-        int i = 0;
-        while(true) {
-            int idxQuote = text.indexOf('"', i);
-            int idxSlash = text.indexOf('\\', i);
-            int idx = Math.min(
-                idxQuote < 0 ? Integer.MAX_VALUE : idxQuote, 
-                idxSlash < 0 ? Integer.MAX_VALUE : idxSlash);
-            if (idx == Integer.MAX_VALUE) {
-                break;
-            }
-            if (idx != 0) {
-                this.writer.write(text.substring(i, idx));
-            }
-            if (idx == idxQuote) {
-                this.writer.write("\\\"");
-            } else {
-                this.writer.write("\\\\");
-            }
-            i = idx+1;
-        }
-        
-        this.writer.write(text.substring(i));
+        jsonEscapeUtils.escape(text, writer);
         if (needsQuotes(clazz)) {
             writer.write("\"");
         }
