diff --git a/src/main/java/org/json/JSONArray.java b/src/main/java/org/json/JSONArray.java index ded271e17..11980bbd9 100644 --- a/src/main/java/org/json/JSONArray.java +++ b/src/main/java/org/json/JSONArray.java @@ -144,6 +144,42 @@ public JSONArray(JSONTokener x, JSONParserConfiguration jsonParserConfiguration) } } } + + if (jsonParserConfiguration.isStrictMode()) { + validateInput(x); + } + } + + /** + * Checks if Array adheres to strict mode guidelines, if not, throws JSONException providing back the input in the + * error message. + * + * @param x tokener used to examine input. + * @throws JSONException if input is not compliant with strict mode guidelines; + */ + private void validateInput(JSONTokener x) { + char nextChar = x.getPrevious(); + + boolean isEndOfArray = nextChar == ']'; + boolean nextCharacterIsNotEoF = x.nextClean() != 0; + + if (isEndOfArray && nextCharacterIsNotEoF) { + String completeInput = collectCompleteInput(x); + throw new JSONException("Provided Array is not compliant with strict mode guidelines: " + completeInput); + } + } + + private String collectCompleteInput(JSONTokener x) { + String nonCompliantStringAfterArray = collectNonCompliantStringAfterArray(x); + return myArrayList + nonCompliantStringAfterArray; + } + + private String collectNonCompliantStringAfterArray(JSONTokener x) { + StringBuilder sb = new StringBuilder().append(x.getPrevious()); + while(x.nextClean() != 0){ + sb.append(x.getPrevious()); + } + return sb.toString(); } /** diff --git a/src/test/java/org/json/junit/JSONParserConfigurationTest.java b/src/test/java/org/json/junit/JSONParserConfigurationTest.java index a1838a4ee..b4f0c4d59 100644 --- a/src/test/java/org/json/junit/JSONParserConfigurationTest.java +++ b/src/test/java/org/json/junit/JSONParserConfigurationTest.java @@ -46,6 +46,16 @@ public void givenInvalidInputArrays_testStrictModeTrue_shouldThrowJsonException( () -> new JSONArray(testCase, jsonParserConfiguration))); } + @Test + public void givenValidDoubleArray_testStrictModeTrue_shouldNotThrowJsonException() { + JSONParserConfiguration jsonParserConfiguration = new JSONParserConfiguration() + .withStrictMode(true); + + String testCase = "[[\"c\"],[\"a\"]]"; + + new JSONArray(testCase, jsonParserConfiguration); + } + @Test public void givenCompliantJSONArrayFile_testStrictModeTrue_shouldNotThrowAnyException() throws IOException { try (Stream lines = Files.lines(Paths.get("src/test/resources/compliantJsonArray.json"))) { @@ -208,6 +218,15 @@ public void verifyMaxDepthThenDuplicateKey() { */ private List getNonCompliantJSONList() { return Arrays.asList( + "[]asdf", + "[]]", + "[]}", + "[][", + "[]{", + "[],", + "[]:", + "[],[", + "[],{", "[1,2];[3,4]", "[test]", "[{'testSingleQuote': 'testSingleQuote'}]",