[Practicalxml-commits] SF.net SVN: practicalxml:[157] branches/dev-1.1/src
Brought to you by:
kdgregory
From: Auto-Generated S. C. M. <pra...@li...> - 2009-09-24 16:59:08
|
Revision: 157 http://practicalxml.svn.sourceforge.net/practicalxml/?rev=157&view=rev Author: kdgregory Date: 2009-09-24 16:58:59 +0000 (Thu, 24 Sep 2009) Log Message: ----------- xml -> json: support quoted fieldnames Modified Paths: -------------- branches/dev-1.1/src/main/java/net/sf/practicalxml/converter/json/Json2XmlConverter.java 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/Xml2JsonOptions.java branches/dev-1.1/src/test/java/net/sf/practicalxml/converter/json/TestJson2XmlConverter.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/Json2XmlConverter.java =================================================================== --- branches/dev-1.1/src/main/java/net/sf/practicalxml/converter/json/Json2XmlConverter.java 2009-09-24 01:21:05 UTC (rev 156) +++ branches/dev-1.1/src/main/java/net/sf/practicalxml/converter/json/Json2XmlConverter.java 2009-09-24 16:58:59 UTC (rev 157) @@ -29,6 +29,8 @@ * only once (thus thread-safety is not an issue). * <p> * See <a href="http://www.json.org/">json.org</a> for the JSON grammar. + * This implementation will also accept strings that do not quote their + * field names. * <p> * The current implementation creates a child element for each element * of an array, producing output similar to that from the Bean->XML @@ -140,6 +142,8 @@ String next = nextToken(); if (atEndOfSequence(next, "}", false)) return; + if (next.equals("\"")) + next = parseString(); while (true) { 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-24 01:21:05 UTC (rev 156) +++ branches/dev-1.1/src/main/java/net/sf/practicalxml/converter/json/Xml2JsonConverter.java 2009-09-24 16:58:59 UTC (rev 157) @@ -31,12 +31,12 @@ */ public class Xml2JsonConverter { - private EnumSet<Json2XmlOptions> _options = EnumSet.noneOf(Json2XmlOptions.class); + private EnumSet<Xml2JsonOptions> _options = EnumSet.noneOf(Xml2JsonOptions.class); - public Xml2JsonConverter(Json2XmlOptions... options) + public Xml2JsonConverter(Xml2JsonOptions... options) { - for (Json2XmlOptions option : options) + for (Xml2JsonOptions option : options) _options.add(option); } @@ -85,15 +85,6 @@ } - private StringBuilder appendText(StringBuilder buf, String text) - { - buf.append('"') - .append(JsonUtil.escape(text)) - .append('"'); - return buf; - } - - private StringBuilder appendObject(StringBuilder buf, List<Element> children) { List<String> names = new ArrayList<String>(); @@ -105,7 +96,7 @@ for (Iterator<String> itx = names.iterator() ; itx.hasNext() ; ) { String name = itx.next(); - buf.append(name).append(": "); + appendFieldName(buf, name); if (arrays.containsKey(name)) appendArray(buf, arrays.get(name)); else @@ -164,4 +155,27 @@ } } } + + + private StringBuilder appendFieldName(StringBuilder buf, String name) + { + if (_options.contains(Xml2JsonOptions.QUOTE_FIELD_NAMES)) + buf.append('"') + .append(name) + .append('"'); + else + buf.append(name); + + buf.append(": "); + return buf; + } + + + private StringBuilder appendText(StringBuilder buf, String text) + { + buf.append('"') + .append(JsonUtil.escape(text)) + .append('"'); + return buf; + } } Modified: branches/dev-1.1/src/main/java/net/sf/practicalxml/converter/json/Xml2JsonOptions.java =================================================================== --- branches/dev-1.1/src/main/java/net/sf/practicalxml/converter/json/Xml2JsonOptions.java 2009-09-24 01:21:05 UTC (rev 156) +++ branches/dev-1.1/src/main/java/net/sf/practicalxml/converter/json/Xml2JsonOptions.java 2009-09-24 16:58:59 UTC (rev 157) @@ -20,5 +20,11 @@ */ public enum Xml2JsonOptions { - // nothing here right now + /** + * If enabled, field names will be quoted. This is required by the + * <a href="http://www.json.org/">JSON spec</a>, so should be used + * if you expect to use the result anywhere but in a browser. It is + * not required by <code>eval()</code>, nor for explicit scripting. + */ + QUOTE_FIELD_NAMES } Modified: branches/dev-1.1/src/test/java/net/sf/practicalxml/converter/json/TestJson2XmlConverter.java =================================================================== --- branches/dev-1.1/src/test/java/net/sf/practicalxml/converter/json/TestJson2XmlConverter.java 2009-09-24 01:21:05 UTC (rev 156) +++ branches/dev-1.1/src/test/java/net/sf/practicalxml/converter/json/TestJson2XmlConverter.java 2009-09-24 16:58:59 UTC (rev 157) @@ -168,6 +168,21 @@ } + public void testConvertSingleElementWithQuotedFieldname() throws Exception + { + String src = "{\"foo\": 123}"; + + Element root = new Json2XmlConverter(src).convert(); + assertEquals("data", root.getNodeName()); + assertEquals(1, root.getChildNodes().getLength()); + + Element child = (Element)root.getFirstChild(); + assertEquals("foo", child.getNodeName()); + assertEquals("123", DomUtil.getText(child)); + assertEquals(0, DomUtil.getChildren(child).size()); + } + + public void testFailUnterminatedString() throws Exception { String src = "{foo: \"bar}"; 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-24 01:21:05 UTC (rev 156) +++ branches/dev-1.1/src/test/java/net/sf/practicalxml/converter/json/TestXml2JsonConverter.java 2009-09-24 16:58:59 UTC (rev 157) @@ -34,10 +34,12 @@ // Support Code //---------------------------------------------------------------------------- - public void convertAndAssert(String expected, ElementNode rootNode) + public void convertAndAssert( + String expected, ElementNode rootNode, + Xml2JsonOptions... options) { Element root = rootNode.toDOM().getDocumentElement(); - String json = new Xml2JsonConverter().convert(root); + String json = new Xml2JsonConverter(options).convert(root); assertEquals(expected, json); } @@ -132,6 +134,16 @@ } + public void testQuotedFieldnames() throws Exception + { + convertAndAssert( + "{\"foo\": \"bar\"}", + element("data", + element("foo", text("bar"))), + Xml2JsonOptions.QUOTE_FIELD_NAMES); + } + + public void testStringEscaping() throws Exception { convertAndAssert( This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |