diff --git a/src/main/java/org/json/JSONTokener.java b/src/main/java/org/json/JSONTokener.java index acb9c8878..b4c5d1b44 100644 --- a/src/main/java/org/json/JSONTokener.java +++ b/src/main/java/org/json/JSONTokener.java @@ -522,10 +522,10 @@ private Object parsedUnquotedText(char c, boolean strictMode) { } if (strictMode) { - boolean isBooleanOrNumeric = checkIfValueIsBooleanOrNumeric(string); + Object stringToVal = JSONObject.stringToValue(string); - if (isBooleanOrNumeric) { - return string; + if (stringToVal instanceof Number || stringToVal instanceof Boolean) { + return stringToVal; } throw new JSONException(String.format("Value is not surrounded by quotes: %s", string)); @@ -534,20 +534,6 @@ private Object parsedUnquotedText(char c, boolean strictMode) { return JSONObject.stringToValue(string); } - private boolean checkIfValueIsBooleanOrNumeric(Object valueToValidate) { - String stringToValidate = valueToValidate.toString(); - if (stringToValidate.equals("true") || stringToValidate.equals("false")) { - return true; - } - - try { - Double.parseDouble(stringToValidate); - return true; - } catch (NumberFormatException e) { - return false; - } - } - /** * Skip characters until the next character is the requested character. * If the requested character is not found, no characters are skipped. diff --git a/src/test/java/org/json/junit/JSONParserConfigurationTest.java b/src/test/java/org/json/junit/JSONParserConfigurationTest.java index f36f4cfbd..d8f8c7e09 100644 --- a/src/test/java/org/json/junit/JSONParserConfigurationTest.java +++ b/src/test/java/org/json/junit/JSONParserConfigurationTest.java @@ -51,9 +51,35 @@ public void givenValidDoubleArray_testStrictModeTrue_shouldNotThrowJsonException JSONParserConfiguration jsonParserConfiguration = new JSONParserConfiguration() .withStrictMode(true); - String testCase = "[[\"c\"],[\"a\"]]"; + String testCase = "[[\"c\"], [10.2], [true, false, true]]"; - new JSONArray(testCase, jsonParserConfiguration); + JSONArray jsonArray = new JSONArray(testCase, jsonParserConfiguration); + JSONArray arrayShouldContainStringAt0 = jsonArray.getJSONArray(0); + JSONArray arrayShouldContainNumberAt0 = jsonArray.getJSONArray(1); + JSONArray arrayShouldContainBooleanAt0 = jsonArray.getJSONArray(2); + + assertTrue(arrayShouldContainStringAt0.get(0) instanceof String); + assertTrue(arrayShouldContainNumberAt0.get(0) instanceof Number); + assertTrue(arrayShouldContainBooleanAt0.get(0) instanceof Boolean); + } + + @Test + public void givenInvalidString_testStrictModeTrue_shouldThrowJsonException() { + JSONParserConfiguration jsonParserConfiguration = new JSONParserConfiguration() + .withStrictMode(true); + + String testCase = "[badString]"; + + JSONException je = assertThrows(JSONException.class, () -> new JSONArray(testCase, jsonParserConfiguration)); + + assertEquals("Value is not surrounded by quotes: badString", je.getMessage()); + } + + @Test + public void shouldHandleNumericArray() { + String expected = "[10]"; + JSONArray jsonArray = new JSONArray(expected, new JSONParserConfiguration().withStrictMode(true)); + assertEquals(expected, jsonArray.toString()); } @Test