[Practicalxml-commits] SF.net SVN: practicalxml:[127] branches/dev-1.1/src
Brought to you by:
kdgregory
From: Auto-Generated S. C. M. <pra...@li...> - 2009-09-11 18:30:46
|
Revision: 127 http://practicalxml.svn.sourceforge.net/practicalxml/?rev=127&view=rev Author: kdgregory Date: 2009-09-11 18:30:39 +0000 (Fri, 11 Sep 2009) Log Message: ----------- Xml2JsonConverter now escapes strings Modified Paths: -------------- branches/dev-1.1/src/main/java/net/sf/practicalxml/converter/json/JsonUtil.java branches/dev-1.1/src/main/java/net/sf/practicalxml/converter/json/Xml2JsonConverter.java branches/dev-1.1/src/test/java/net/sf/practicalxml/converter/json/TestJsonUtil.java branches/dev-1.1/src/test/java/net/sf/practicalxml/converter/json/TestXml2JsonConverter.java Modified: branches/dev-1.1/src/main/java/net/sf/practicalxml/converter/json/JsonUtil.java =================================================================== --- branches/dev-1.1/src/main/java/net/sf/practicalxml/converter/json/JsonUtil.java 2009-09-11 17:43:24 UTC (rev 126) +++ branches/dev-1.1/src/main/java/net/sf/practicalxml/converter/json/JsonUtil.java 2009-09-11 18:30:39 UTC (rev 127) @@ -24,6 +24,53 @@ public class JsonUtil { /** + * Escapes a string, replacing quotes, backslashes, non-printable and + * non-ASCII characters by a defined set of single-character or 4-digit + * unicode escapes. + */ + public static String escape(String src) + { + if (src == null) + return ""; + + StringBuffer buf = new StringBuffer(src.length() + 20); + for (int ii = 0 ; ii < src.length() ; ii++) + { + char c = src.charAt(ii); + switch (c) + { + case '"' : + case '\\' : + case '/' : + buf.append('\\').append(c); + break; + case '\b' : + buf.append("\\b"); + break; + case '\f' : + buf.append("\\f"); + break; + case '\n' : + buf.append("\\n"); + break; + case '\r' : + buf.append("\\r"); + break; + case '\t' : + buf.append("\\t"); + break; + default : + if ((c >= 32) && (c <= 127)) + buf.append(c); + else + buf.append(escapeUnicode(c)); + } + } + return buf.toString(); + } + + + /** * Unescapes a string, replacing "slash-sequences" by actual characters. * Null is converted to empty string. * @@ -100,4 +147,18 @@ } return (char)value; } + + + private static String escapeUnicode(char c) + { + char[] buf = new char[] { '\\', 'u', '0', '0', '0', '0' }; + int value = c & 0xFFFF; + for (int ii = 5 ; ii > 1 ; ii--) + { + int digit = value % 16; + value /= 16; + buf[ii] = Character.forDigit(digit, 16); + } + return new String(buf); + } } Modified: branches/dev-1.1/src/main/java/net/sf/practicalxml/converter/json/Xml2JsonConverter.java =================================================================== --- branches/dev-1.1/src/main/java/net/sf/practicalxml/converter/json/Xml2JsonConverter.java 2009-09-11 17:43:24 UTC (rev 126) +++ branches/dev-1.1/src/main/java/net/sf/practicalxml/converter/json/Xml2JsonConverter.java 2009-09-11 18:30:39 UTC (rev 127) @@ -48,7 +48,7 @@ private StringBuffer appendText(String text, StringBuffer buf) { buf.append('"') - .append(text) + .append(JsonUtil.escape(text)) .append('"'); return buf; } Modified: branches/dev-1.1/src/test/java/net/sf/practicalxml/converter/json/TestJsonUtil.java =================================================================== --- branches/dev-1.1/src/test/java/net/sf/practicalxml/converter/json/TestJsonUtil.java 2009-09-11 17:43:24 UTC (rev 126) +++ branches/dev-1.1/src/test/java/net/sf/practicalxml/converter/json/TestJsonUtil.java 2009-09-11 18:30:39 UTC (rev 127) @@ -18,6 +18,45 @@ public class TestJsonUtil extends TestCase { + public void testEscapeNullAndEmpty() throws Exception + { + assertEquals("", JsonUtil.escape(null)); + assertEquals("", JsonUtil.escape("")); + } + + + public void testEscapeNormalString() throws Exception + { + assertEquals("f", JsonUtil.unescape("f")); + assertEquals("fo", JsonUtil.unescape("fo")); + assertEquals("foo", JsonUtil.unescape("foo")); + } + + + public void testEescapeSingleChar() throws Exception + { + assertEquals("\\\"", JsonUtil.escape("\"")); + assertEquals("\\\\", JsonUtil.escape("\\")); + assertEquals("\\/", JsonUtil.escape("/")); + assertEquals("\\b", JsonUtil.escape("\b")); + assertEquals("\\f", JsonUtil.escape("\f")); + assertEquals("\\n", JsonUtil.escape("\n")); + assertEquals("\\r", JsonUtil.escape("\r")); + assertEquals("\\t", JsonUtil.escape("\t")); + + // and a couple of tests to ensure that we don't overstep + assertEquals("ba\\rbaz", JsonUtil.escape("ba\rbaz")); + assertEquals("\\r\\n", JsonUtil.escape("\r\n")); + } + + + public void testEscapeUnicode() throws Exception + { + assertEquals("\\u0019", JsonUtil.escape("\u0019")); + assertEquals("\\u1bcd", JsonUtil.escape("\u1bcd")); + } + + public void testUnescapeNullAndEmpty() throws Exception { assertEquals("", JsonUtil.unescape(null)); @@ -33,7 +72,7 @@ } - public void testUnescapeSingleCharSlashes() throws Exception + public void testUnescapeSingleChar() throws Exception { assertEquals("\"", JsonUtil.unescape("\\\"")); assertEquals("\\", JsonUtil.unescape("\\\\")); Modified: branches/dev-1.1/src/test/java/net/sf/practicalxml/converter/json/TestXml2JsonConverter.java =================================================================== --- branches/dev-1.1/src/test/java/net/sf/practicalxml/converter/json/TestXml2JsonConverter.java 2009-09-11 17:43:24 UTC (rev 126) +++ branches/dev-1.1/src/test/java/net/sf/practicalxml/converter/json/TestXml2JsonConverter.java 2009-09-11 18:30:39 UTC (rev 127) @@ -84,4 +84,19 @@ element("biz", text("baz")), element("fizz", text("buzz"))))); } + + + public void testStringEscaping() throws Exception + { + convertAndAssert( + "{backslash: \"\\\\\", " + + "quote: \"\\\"\", " + + "nonprint: \"\\b\\f\\n\\r\\t\", " + + "unicode: \"b\\u00e4r\"}", + element("data", + element("backslash", text("\\")), + element("quote", text("\"")), + element("nonprint", text("\b\f\n\r\t")), + element("unicode", text("b\u00e4r")))); + } } This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |