@@ -20,6 +20,78 @@ def join_closing_tokens(stack: List[Tuple[int, str]]):
2020
2121def fix_fast (json_string : str , allow_partial : Union [Allow , int ] = ALL ):
2222 allow = Allow (allow_partial )
23+
24+ # Handle PREFIX by finding first { or [
25+ if PREFIX in allow :
26+ first_brace = json_string .find ('{' )
27+ first_bracket = json_string .find ('[' )
28+
29+ if first_brace != - 1 and (first_bracket == - 1 or first_brace < first_bracket ):
30+ json_string = json_string [first_brace :]
31+ elif first_bracket != - 1 :
32+ json_string = json_string [first_bracket :]
33+
34+ # Handle POSTFIX by finding last } or ]
35+ if POSTFIX in allow :
36+ last_brace = json_string .rfind ('}' )
37+ last_bracket = json_string .rfind (']' )
38+
39+ if last_brace != - 1 and (last_bracket == - 1 or last_brace > last_bracket ):
40+ json_string = json_string [:last_brace + 1 ]
41+ elif last_bracket != - 1 :
42+ json_string = json_string [:last_bracket + 1 ]
43+
44+ # Always enable STR when handling PREFIX/POSTFIX
45+ if PREFIX in allow or POSTFIX in allow :
46+ allow = Allow (allow | STR )
47+
48+ return _fix (json_string , allow , True )
49+
50+
51+ def fix_fast_old (json_string : str , allow_partial : Union [Allow , int ] = ALL ):
52+ allow = Allow (allow_partial )
53+ original_allow = allow
54+
55+ # Handle PREFIX by finding first { or [
56+ if PREFIX in allow :
57+ first_brace = json_string .find ('{' )
58+ first_bracket = json_string .find ('[' )
59+
60+ if first_brace != - 1 and (first_bracket == - 1 or first_brace < first_bracket ):
61+ json_string = json_string [first_brace :]
62+ elif first_bracket != - 1 :
63+ json_string = json_string [first_bracket :]
64+
65+ # Handle POSTFIX by finding matching closing brace/bracket
66+ if POSTFIX in allow :
67+ # Find opening token
68+ first_char = json_string [0 ] if json_string else ''
69+ if first_char not in '{[' :
70+ # No valid JSON start found
71+ return _fix (json_string , original_allow , True )
72+
73+ # Find matching closing token
74+ closing_char = '}' if first_char == '{' else ']'
75+ stack = []
76+ in_string = False
77+
78+ for i , char in enumerate (json_string ):
79+ if char == '"' and (i == 0 or json_string [i - 1 ] != '\\ ' ):
80+ in_string = not in_string
81+ elif not in_string :
82+ if char in '{[' :
83+ stack .append (char )
84+ elif char in ']}' :
85+ if not stack :
86+ break
87+ if (char == '}' and stack [- 1 ] == '{' ) or (char == ']' and stack [- 1 ] == '[' ):
88+ stack .pop ()
89+ if not stack : # Found matching closing token
90+ json_string = json_string [:i + 1 ]
91+ break
92+
93+ # Remove PREFIX/POSTFIX from allow since we've handled them
94+ allow = Allow (allow & ~ (PREFIX | POSTFIX ))
2395
2496 def is_escaped (index : int ):
2597 text_before = json_string [:index ]
0 commit comments