From 8826fac13bf4134ef0ff705d467a7dc36f17b365 Mon Sep 17 00:00:00 2001 From: Khoa Tran Date: Thu, 28 Nov 2024 08:33:57 +0700 Subject: [PATCH 1/2] Fix missing end quote of value with more cases --- .../internal/EscapeProcessor.java | 59 ++++++++++++++----- .../jsonautorepair/JSONAutoRepairerTest.java | 28 ++++++--- 2 files changed, 62 insertions(+), 25 deletions(-) diff --git a/src/main/java/com/cdpn/jsonautorepair/internal/EscapeProcessor.java b/src/main/java/com/cdpn/jsonautorepair/internal/EscapeProcessor.java index 110da08..cc39978 100644 --- a/src/main/java/com/cdpn/jsonautorepair/internal/EscapeProcessor.java +++ b/src/main/java/com/cdpn/jsonautorepair/internal/EscapeProcessor.java @@ -75,22 +75,6 @@ private boolean hasNextQuoteRightAfterCurrentQuoteWithoutComma(int position) { } private void handleNonQuoteCharacter(char currentChar, int position) { - if (currentChar == COMMA) { - char nextNonSpaceChar = findNextNonSpaceChar(position + 1); - if (inQuotes) { - if (nextNonSpaceChar == DOUBLE_QUOTE_CHAR ) { - escapedJson.append(DOUBLE_QUOTE_CHAR); - inQuotes = false; - } - if (nextNonSpaceChar == CLOSED_BRACKET ) { - escapedJson.append(DOUBLE_QUOTE_CHAR); - inQuotes = false; - return; - } - } - escapedJson.append(currentChar); - return; - } if (!inQuotes) { escapedJson.append(currentChar); return; @@ -99,6 +83,38 @@ private void handleNonQuoteCharacter(char currentChar, int position) { escapedJson.append(getEscapeStringFromChar(currentChar)); return; } + if (currentChar == COMMA) { + handleCommaToFixMissingClosedQuote(currentChar, position); + return; + } + if (currentChar == CLOSED_BRACKET) { + handleClosedBracket(currentChar, position); + return; + } + escapedJson.append(currentChar); + } + + private void handleClosedBracket(char currentChar, int position) { + int previousNonSpaceCharPosition = getPreviousNonSpaceCharPosition(position - 1); + if (previousNonSpaceCharPosition != -1) { + escapedJson = new StringBuilder(escapedJson.substring(0, previousNonSpaceCharPosition + 1 )); + } + escapedJson.append(DOUBLE_QUOTE_CHAR); + escapedJson.append(currentChar); + inQuotes = false; + } + + private void handleCommaToFixMissingClosedQuote(char currentChar, int position) { + char nextNonSpaceChar = findNextNonSpaceChar(position + 1); + if (nextNonSpaceChar == DOUBLE_QUOTE_CHAR ) { + escapedJson.append(DOUBLE_QUOTE_CHAR); + inQuotes = false; + } + if (nextNonSpaceChar == CLOSED_BRACKET ) { + escapedJson.append(DOUBLE_QUOTE_CHAR); + inQuotes = false; + return; + } escapedJson.append(currentChar); } @@ -128,6 +144,7 @@ private char findNextNonSpaceChar(int position) { return EOF; } + private int getNextNonSpaceCharPosition(int position) { for (int i = position; i < inputString.length(); i++) { char currentChar = inputString.charAt(i); @@ -138,4 +155,14 @@ private int getNextNonSpaceCharPosition(int position) { return -1; } + private int getPreviousNonSpaceCharPosition(int position) { + for (int i = position; i >= 0; i--) { + char currentChar = inputString.charAt(i); + if (currentChar != SPACE_CHAR && currentChar != BREAK_LINE_CHAR && currentChar != TAB_CHAR) { + return i; + } + } + return -1; + } + } diff --git a/src/test/java/com/cdpn/jsonautorepair/JSONAutoRepairerTest.java b/src/test/java/com/cdpn/jsonautorepair/JSONAutoRepairerTest.java index b00523c..5c8ad5d 100644 --- a/src/test/java/com/cdpn/jsonautorepair/JSONAutoRepairerTest.java +++ b/src/test/java/com/cdpn/jsonautorepair/JSONAutoRepairerTest.java @@ -39,29 +39,39 @@ public void repair_should_cleanup_markdown_code_block_when_string_contain_json_c @Test public void repair_should_fix_missing_end_quote_of_value() { - String originalJSON = """ + + assertEquals(JsonParser.parseString(""" { - "name": "Alice, + "name": "Alice", "age": 30 } - """; - assertEquals(JsonParser.parseString(""" + """).toString(), jsonAutoRepairer.repair(""" { - "name": "Alice", + "name": "Alice, "age": 30 } - """).toString(), jsonAutoRepairer.repair(originalJSON)); + """)); - originalJSON = """ + assertEquals(JsonParser.parseString(""" + { + "name": "Alice" + } + """).toString(), jsonAutoRepairer.repair(""" { "name": "Alice, } - """; + """)); + + assertEquals(JsonParser.parseString(""" { "name": "Alice" } - """).toString(), jsonAutoRepairer.repair(originalJSON)); + """).toString(), jsonAutoRepairer.repair(""" + { + "name": "Alice + } + """)); } From 0898af0eb9de6b8ae294e9e199be10f74da892e8 Mon Sep 17 00:00:00 2001 From: Khoa Tran Date: Thu, 28 Nov 2024 08:34:24 +0700 Subject: [PATCH 2/2] Fix the workflow to prevent commit coverage badge if it's a PR --- .github/workflows/maven.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/.github/workflows/maven.yml b/.github/workflows/maven.yml index 9547415..6df2e7d 100644 --- a/.github/workflows/maven.yml +++ b/.github/workflows/maven.yml @@ -46,6 +46,7 @@ jobs: name: jacoco-report path: target/site/jacoco/ - name: Commit and push + if: github.event_name != 'pull_request' run: | cd badges if [[ `git status --porcelain *.svg` ]]; then