fix(#887): complete strictMode for JSONArray

This commit is contained in:
rikkarth 2024-04-14 23:11:17 +01:00
parent d02ac0f2a3
commit fe597d296e
No known key found for this signature in database
GPG Key ID: 11E5F28B0AED6AC7
2 changed files with 55 additions and 0 deletions

View File

@ -144,6 +144,42 @@ public class JSONArray implements Iterable<Object> {
}
}
}
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();
}
/**

View File

@ -46,6 +46,16 @@ public class JSONParserConfigurationTest {
() -> 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<String> lines = Files.lines(Paths.get("src/test/resources/compliantJsonArray.json"))) {
@ -208,6 +218,15 @@ public class JSONParserConfigurationTest {
*/
private List<String> getNonCompliantJSONList() {
return Arrays.asList(
"[]asdf",
"[]]",
"[]}",
"[][",
"[]{",
"[],",
"[]:",
"[],[",
"[],{",
"[1,2];[3,4]",
"[test]",
"[{'testSingleQuote': 'testSingleQuote'}]",