Skip to content

Commit

Permalink
fix(#887): regression parsing array with non-string and boolean values
Browse files Browse the repository at this point in the history
  • Loading branch information
rikkarth committed Apr 23, 2024
1 parent 0bace72 commit 7cc1948
Show file tree
Hide file tree
Showing 2 changed files with 31 additions and 19 deletions.
20 changes: 3 additions & 17 deletions src/main/java/org/json/JSONTokener.java
Expand Up @@ -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));
Expand All @@ -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.
Expand Down
30 changes: 28 additions & 2 deletions src/test/java/org/json/junit/JSONParserConfigurationTest.java
Expand Up @@ -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
Expand Down

0 comments on commit 7cc1948

Please sign in to comment.