mirror of
https://github.com/stleary/JSON-java.git
synced 2025-08-03 03:15:32 -04:00
fix: introduce optional XMLtoJSONMLParserConfiguration parameter for JSONML.toJSONArray(...) functions, to facilitate max nesting depth override.
This commit is contained in:
parent
a6e412bded
commit
df2d6f8363
@ -280,6 +280,55 @@ public class JSONML {
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Convert a well-formed (but not necessarily valid) XML string into a
|
||||||
|
* JSONArray using the JsonML transform. Each XML tag is represented as
|
||||||
|
* a JSONArray in which the first element is the tag name. If the tag has
|
||||||
|
* attributes, then the second element will be JSONObject containing the
|
||||||
|
* name/value pairs. If the tag contains children, then strings and
|
||||||
|
* JSONArrays will represent the child tags.
|
||||||
|
* As opposed to toJSONArray this method does not attempt to convert
|
||||||
|
* any text node or attribute value to any type
|
||||||
|
* but just leaves it as a string.
|
||||||
|
* Comments, prologs, DTDs, and <pre>{@code <[ [ ]]>}</pre> are ignored.
|
||||||
|
* @param string The source string.
|
||||||
|
* @param config The XML parser configuration:
|
||||||
|
* XMLtoJSONMLParserConfiguration.ORIGINAL is the default behaviour;
|
||||||
|
* XMLtoJSONMLParserConfiguration.KEEP_STRINGS means values will not be coerced into boolean
|
||||||
|
* or numeric values and will instead be left as strings
|
||||||
|
* @return A JSONArray containing the structured data from the XML string.
|
||||||
|
* @throws JSONException Thrown on error converting to a JSONArray
|
||||||
|
*/
|
||||||
|
public static JSONArray toJSONArray(String string, XMLtoJSONMLParserConfiguration config) throws JSONException {
|
||||||
|
return (JSONArray)parse(new XMLTokener(string), true, null, config, 0);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Convert a well-formed (but not necessarily valid) XML string into a
|
||||||
|
* JSONArray using the JsonML transform. Each XML tag is represented as
|
||||||
|
* a JSONArray in which the first element is the tag name. If the tag has
|
||||||
|
* attributes, then the second element will be JSONObject containing the
|
||||||
|
* name/value pairs. If the tag contains children, then strings and
|
||||||
|
* JSONArrays will represent the child content and tags.
|
||||||
|
* As opposed to toJSONArray this method does not attempt to convert
|
||||||
|
* any text node or attribute value to any type
|
||||||
|
* but just leaves it as a string.
|
||||||
|
* Comments, prologs, DTDs, and <pre>{@code <[ [ ]]>}</pre> are ignored.
|
||||||
|
* @param x An XMLTokener.
|
||||||
|
* @param config The XML parser configuration:
|
||||||
|
* XMLtoJSONMLParserConfiguration.ORIGINAL is the default behaviour;
|
||||||
|
* XMLtoJSONMLParserConfiguration.KEEP_STRINGS means values will not be coerced into boolean
|
||||||
|
* or numeric values and will instead be left as strings
|
||||||
|
* @return A JSONArray containing the structured data from the XML string.
|
||||||
|
* @throws JSONException Thrown on error converting to a JSONArray
|
||||||
|
*/
|
||||||
|
public static JSONArray toJSONArray(XMLTokener x, XMLtoJSONMLParserConfiguration config) throws JSONException {
|
||||||
|
return (JSONArray)parse(x, true, null, config, 0);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Convert a well-formed (but not necessarily valid) XML string into a
|
* Convert a well-formed (but not necessarily valid) XML string into a
|
||||||
* JSONArray using the JsonML transform. Each XML tag is represented as
|
* JSONArray using the JsonML transform. Each XML tag is represented as
|
||||||
|
@ -835,7 +835,71 @@ public class JSONMLTest {
|
|||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
public void testMaxNestingDepthOf42IsRespected() {
|
public void testToJSONArrayMaxNestingDepthOf42IsRespected() {
|
||||||
|
final String wayTooLongMalformedXML = new String(new char[6000]).replace("\0", "<a>");
|
||||||
|
|
||||||
|
final int maxNestingDepth = 42;
|
||||||
|
|
||||||
|
try {
|
||||||
|
JSONML.toJSONArray(wayTooLongMalformedXML, XMLtoJSONMLParserConfiguration.ORIGINAL.withMaxNestingDepth(maxNestingDepth));
|
||||||
|
|
||||||
|
fail("Expecting a JSONException");
|
||||||
|
} catch (JSONException e) {
|
||||||
|
assertTrue("Wrong throwable thrown: not expecting message <" + e.getMessage() + ">",
|
||||||
|
e.getMessage().startsWith("Maximum nesting depth of " + maxNestingDepth));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void testToJSONArrayMaxNestingDepthIsRespectedWithValidXML() {
|
||||||
|
final String perfectlyFineXML = "<Test>\n" +
|
||||||
|
" <employee>\n" +
|
||||||
|
" <name>sonoo</name>\n" +
|
||||||
|
" <salary>56000</salary>\n" +
|
||||||
|
" <married>true</married>\n" +
|
||||||
|
" </employee>\n" +
|
||||||
|
"</Test>\n";
|
||||||
|
|
||||||
|
final int maxNestingDepth = 1;
|
||||||
|
|
||||||
|
try {
|
||||||
|
JSONML.toJSONArray(perfectlyFineXML, XMLtoJSONMLParserConfiguration.ORIGINAL.withMaxNestingDepth(maxNestingDepth));
|
||||||
|
|
||||||
|
fail("Expecting a JSONException");
|
||||||
|
} catch (JSONException e) {
|
||||||
|
assertTrue("Wrong throwable thrown: not expecting message <" + e.getMessage() + ">",
|
||||||
|
e.getMessage().startsWith("Maximum nesting depth of " + maxNestingDepth));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void testToJSONArrayMaxNestingDepthWithValidFittingXML() {
|
||||||
|
final String perfectlyFineXML = "<Test>\n" +
|
||||||
|
" <employee>\n" +
|
||||||
|
" <name>sonoo</name>\n" +
|
||||||
|
" <salary>56000</salary>\n" +
|
||||||
|
" <married>true</married>\n" +
|
||||||
|
" </employee>\n" +
|
||||||
|
"</Test>\n";
|
||||||
|
|
||||||
|
final int maxNestingDepth = 3;
|
||||||
|
|
||||||
|
try {
|
||||||
|
JSONML.toJSONArray(perfectlyFineXML, XMLtoJSONMLParserConfiguration.ORIGINAL.withMaxNestingDepth(maxNestingDepth));
|
||||||
|
} catch (JSONException e) {
|
||||||
|
e.printStackTrace();
|
||||||
|
fail("XML document should be parsed as its maximum depth fits the maxNestingDepth " +
|
||||||
|
"parameter of the XMLtoJSONMLParserConfiguration used");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void testToJSONObjectMaxNestingDepthOf42IsRespected() {
|
||||||
final String wayTooLongMalformedXML = new String(new char[6000]).replace("\0", "<a>");
|
final String wayTooLongMalformedXML = new String(new char[6000]).replace("\0", "<a>");
|
||||||
|
|
||||||
final int maxNestingDepth = 42;
|
final int maxNestingDepth = 42;
|
||||||
@ -851,7 +915,7 @@ public class JSONMLTest {
|
|||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
public void testMaxNestingDepthIsRespectedWithValidXML() {
|
public void testToJSONObjectMaxNestingDepthIsRespectedWithValidXML() {
|
||||||
final String perfectlyFineXML = "<Test>\n" +
|
final String perfectlyFineXML = "<Test>\n" +
|
||||||
" <employee>\n" +
|
" <employee>\n" +
|
||||||
" <name>sonoo</name>\n" +
|
" <name>sonoo</name>\n" +
|
||||||
@ -873,7 +937,7 @@ public class JSONMLTest {
|
|||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
public void testMaxNestingDepthWithValidFittingXML() {
|
public void testToJSONObjectMaxNestingDepthWithValidFittingXML() {
|
||||||
final String perfectlyFineXML = "<Test>\n" +
|
final String perfectlyFineXML = "<Test>\n" +
|
||||||
" <employee>\n" +
|
" <employee>\n" +
|
||||||
" <name>sonoo</name>\n" +
|
" <name>sonoo</name>\n" +
|
||||||
|
Loading…
x
Reference in New Issue
Block a user