Skip to content

Commit 3fe4eac

Browse files
authored
Merge pull request #2 from coderphonui/1-helpcant-repair-json-missing-closed-quote-in-value
Fix missing end quote of value
2 parents 0b29ed1 + 2c7175e commit 3fe4eac

File tree

2 files changed

+47
-2
lines changed

2 files changed

+47
-2
lines changed

src/main/java/com/cdpn/jsonautorepair/internal/EscapeProcessor.java

+20-2
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,8 @@
33
public class EscapeProcessor {
44
private static final char EOF = '\0';
55
private static final char TAB_CHAR = '\t';
6+
private static final char COMMA = ',';
7+
private static final char CLOSED_BRACKET = '}';
68
private static final char BREAK_LINE_CHAR = '\n';
79
private static final char SPACE_CHAR = ' ';
810
private static final char DOUBLE_QUOTE_CHAR = '\"';
@@ -23,7 +25,7 @@ public String process() {
2325
for (int i = 0; i < inputString.length(); i++) {
2426
char currentChar = inputString.charAt(i);
2527
if (currentChar != DOUBLE_QUOTE_CHAR) {
26-
handleNonQuoteCharacter(currentChar);
28+
handleNonQuoteCharacter(currentChar, i);
2729
}
2830
else {
2931
handleQuoteCharacter(currentChar, i);
@@ -72,7 +74,23 @@ private boolean hasNextQuoteRightAfterCurrentQuoteWithoutComma(int position) {
7274
return findNextNonSpaceChar(position + 1) == DOUBLE_QUOTE_CHAR;
7375
}
7476

75-
private void handleNonQuoteCharacter(char currentChar) {
77+
private void handleNonQuoteCharacter(char currentChar, int position) {
78+
if (currentChar == COMMA) {
79+
char nextNonSpaceChar = findNextNonSpaceChar(position + 1);
80+
if (inQuotes) {
81+
if (nextNonSpaceChar == DOUBLE_QUOTE_CHAR ) {
82+
escapedJson.append(DOUBLE_QUOTE_CHAR);
83+
inQuotes = false;
84+
}
85+
if (nextNonSpaceChar == CLOSED_BRACKET ) {
86+
escapedJson.append(DOUBLE_QUOTE_CHAR);
87+
inQuotes = false;
88+
return;
89+
}
90+
}
91+
escapedJson.append(currentChar);
92+
return;
93+
}
7694
if (!inQuotes) {
7795
escapedJson.append(currentChar);
7896
return;

src/test/java/com/cdpn/jsonautorepair/JSONAutoRepairerTest.java

+27
Original file line numberDiff line numberDiff line change
@@ -37,6 +37,33 @@ public void repair_should_cleanup_markdown_code_block_when_string_contain_json_c
3737

3838
}
3939

40+
@Test
41+
public void repair_should_fix_missing_end_quote_of_value() {
42+
String originalJSON = """
43+
{
44+
"name": "Alice,
45+
"age": 30
46+
}
47+
""";
48+
assertEquals(JsonParser.parseString("""
49+
{
50+
"name": "Alice",
51+
"age": 30
52+
}
53+
""").toString(), jsonAutoRepairer.repair(originalJSON));
54+
55+
originalJSON = """
56+
{
57+
"name": "Alice,
58+
}
59+
""";
60+
assertEquals(JsonParser.parseString("""
61+
{
62+
"name": "Alice"
63+
}
64+
""").toString(), jsonAutoRepairer.repair(originalJSON));
65+
}
66+
4067

4168

4269
@Test

0 commit comments

Comments
 (0)