Write me a python function called fix_json that fixes broken JSON objects, and returns the parsed object. I'll pass the JSON object as a string and it should fix: - Incorect parenthesis, e.g., {"a": (5, 4)} -> {"a": [5, 4]} - Incorrect single quotes, e.g., {'a': 5} -> {"a": 5} - False/True -> false/true Make sure not to break data inside strings! So if there's a True or a ( inside a string keep them the way they are. Also don't break quoted strings
Write me a python function called fix_json that fixes broken JSON objects, and returns the parsed object. I'll pass the JSON object as a string and it should fix: - Incorect parenthesis, e.g., {"a": (5, 4)} -> {"a": [5, 4]} - Incorrect single quotes, e.g., {'a': 5} -> {"a": 5} - False/True -> false/true Make sure not to break data inside strings! So if there's a True or a ( inside a string keep them the way they are. Also don't break quoted strings
# Python JSON Fixing Function Here's a function that fixes common JSON issues while preserving data inside strings:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 | import json def fix_json(broken_json_str): """ Fixes common JSON syntax issues and returns the parsed object: - Replaces tuples (parentheses) with arrays (square brackets) - Replaces single quotes with double quotes - Converts Python booleans (True/False) to JSON booleans (true/false) Args: broken_json_str (str): The potentially broken JSON string Returns: dict/list: The parsed JSON object """ fixed = [] i = 0 in_string = False current_quote = None escaped = False while i < len(broken_json_str): char = broken_json_str[i] # Handle escape sequences if in_string and char == '\\' and not escaped: escaped = True fixed.append(char) i += 1 continue # Handle string boundaries if (char == '"' or char == "'") and not escaped: if not in_string: in_string = True current_quote = char # Always use double quotes for JSON fixed.append('"') elif current_quote == char: in_string = False current_quote = None # Close with double quotes fixed.append('"') else: # A quote character inside a string with different quotes fixed.append(char) # Handle replacements outside strings elif not in_string: # Convert tuple parentheses to array brackets if char == '(': fixed.append('[') elif char == ')': fixed.append(']') # Handle True/False - must check word boundaries elif (i + 3 < len(broken_json_str) and broken_json_str[i:i+4] == 'True' and (i == 0 or not broken_json_str[i-1].isalnum()) and (i + 4 == len(broken_json_str) or not broken_json_str[i+4].isalnum())): fixed.append('true') i += 3 # Skip 'rue' elif (i + 4 < len(broken_json_str) and broken_json_str[i:i+5] == 'False' and (i == 0 or not broken_json_str[i-1].isalnum()) and (i + 5 == len(broken_json_str) or not broken_json_str[i+5].isalnum())): fixed.append('false') i += 4 # Skip 'alse' else: fixed.append(char) else: # Inside a string - preserve all characters fixed.append(char) escaped = False i += 1 fixed_json_str = ''.join(fixed) return json.loads(fixed_json_str) |
1 2 3 4 5 6 7 8 9 10 11 | # Fix single quotes result1 = fix_json("{'name': 'John', 'age': 30}") print(result1) # {'name': 'John', 'age': 30} # Fix tuples and booleans result2 = fix_json('{"points": (1, 2), "active": True}') print(result2) # {'points': [1, 2], 'active': true} # Mixed issues result3 = fix_json("{'data': (5, 'text with (parens) and True/False'), 'valid': False}") print(result3) # {'data': [5, 'text with (parens) and True/False'], 'valid': false} |
I extracted the following code from that output:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 | import json def fix_json(broken_json_str): """ Fixes common JSON syntax issues and returns the parsed object: - Replaces tuples (parentheses) with arrays (square brackets) - Replaces single quotes with double quotes - Converts Python booleans (True/False) to JSON booleans (true/false) Args: broken_json_str (str): The potentially broken JSON string Returns: dict/list: The parsed JSON object """ fixed = [] i = 0 in_string = False current_quote = None escaped = False while i < len(broken_json_str): char = broken_json_str[i] # Handle escape sequences if in_string and char == '\\' and not escaped: escaped = True fixed.append(char) i += 1 continue # Handle string boundaries if (char == '"' or char == "'") and not escaped: if not in_string: in_string = True current_quote = char # Always use double quotes for JSON fixed.append('"') elif current_quote == char: in_string = False current_quote = None # Close with double quotes fixed.append('"') else: # A quote character inside a string with different quotes fixed.append(char) # Handle replacements outside strings elif not in_string: # Convert tuple parentheses to array brackets if char == '(': fixed.append('[') elif char == ')': fixed.append(']') # Handle True/False - must check word boundaries elif (i + 3 < len(broken_json_str) and broken_json_str[i:i+4] == 'True' and (i == 0 or not broken_json_str[i-1].isalnum()) and (i + 4 == len(broken_json_str) or not broken_json_str[i+4].isalnum())): fixed.append('true') i += 3 # Skip 'rue' elif (i + 4 < len(broken_json_str) and broken_json_str[i:i+5] == 'False' and (i == 0 or not broken_json_str[i-1].isalnum()) and (i + 5 == len(broken_json_str) or not broken_json_str[i+5].isalnum())): fixed.append('false') i += 4 # Skip 'alse' else: fixed.append(char) else: # Inside a string - preserve all characters fixed.append(char) escaped = False i += 1 fixed_json_str = ''.join(fixed) return json.loads(fixed_json_str) |
Running the following program:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 | import json def fix_json(broken_json_str): """ Fixes common JSON syntax issues and returns the parsed object: - Replaces tuples (parentheses) with arrays (square brackets) - Replaces single quotes with double quotes - Converts Python booleans (True/False) to JSON booleans (true/false) Args: broken_json_str (str): The potentially broken JSON string Returns: dict/list: The parsed JSON object """ fixed = [] i = 0 in_string = False current_quote = None escaped = False while i < len(broken_json_str): char = broken_json_str[i] # Handle escape sequences if in_string and char == '\\' and not escaped: escaped = True fixed.append(char) i += 1 continue # Handle string boundaries if (char == '"' or char == "'") and not escaped: if not in_string: in_string = True current_quote = char # Always use double quotes for JSON fixed.append('"') elif current_quote == char: in_string = False current_quote = None # Close with double quotes fixed.append('"') else: # A quote character inside a string with different quotes fixed.append(char) # Handle replacements outside strings elif not in_string: # Convert tuple parentheses to array brackets if char == '(': fixed.append('[') elif char == ')': fixed.append(']') # Handle True/False - must check word boundaries elif (i + 3 < len(broken_json_str) and broken_json_str[i:i+4] == 'True' and (i == 0 or not broken_json_str[i-1].isalnum()) and (i + 4 == len(broken_json_str) or not broken_json_str[i+4].isalnum())): fixed.append('true') i += 3 # Skip 'rue' elif (i + 4 < len(broken_json_str) and broken_json_str[i:i+5] == 'False' and (i == 0 or not broken_json_str[i-1].isalnum()) and (i + 5 == len(broken_json_str) or not broken_json_str[i+5].isalnum())): fixed.append('false') i += 4 # Skip 'alse' else: fixed.append(char) else: # Inside a string - preserve all characters fixed.append(char) escaped = False i += 1 fixed_json_str = ''.join(fixed) return json.loads(fixed_json_str) answer = fix_json('''{"a": 5, "b": [3, 4]}''') expected = {"a": 5, "b": [3, 4]} assert answer == expected, f'Wrong answer; got {answer} instead of {expected}' answer = fix_json('''{'a': 5.0, 'b': (True, 4)}''') expected = {"a": 5.0, "b": [True, 4]} assert answer == expected, f'Wrong answer; got {answer} instead of {expected}' answer = fix_json('''{'True': False, 'b()': (3, 4), "c'": []}''') expected = {"True": False, "b()": [3, 4], "c'": []} assert answer == expected, f'Wrong answer; got {answer} instead of {expected}' print('All tests passed') |
All tests passed
Testing if the previous output contains the string All tests passed
: True
Write me a python function called fix_json that fixes broken JSON objects, and returns the parsed object. I'll pass the JSON object as a string and it should fix: - Incorect parenthesis, e.g., {"a": (5, 4)} -> {"a": [5, 4]} - Incorrect single quotes, e.g., {'a': 5} -> {"a": 5} - False/True -> false/true Make sure not to break data inside strings! So if there's a True or a ( inside a string keep them the way they are. Also don't break quoted strings
Write me a python function called fix_json that fixes broken JSON objects, and returns the parsed object. I'll pass the JSON object as a string and it should fix: - Incorect parenthesis, e.g., {"a": (5, 4)} -> {"a": [5, 4]} - Incorrect single quotes, e.g., {'a': 5} -> {"a": 5} - False/True -> false/true Make sure not to break data inside strings! So if there's a True or a ( inside a string keep them the way they are. Also don't break quoted strings
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 | import json def fix_json(json_str): """ Fixes broken JSON objects and returns the parsed object. Fixes: - Incorrect parentheses: (5, 4) -> [5, 4] - Incorrect single quotes: {'a': 5} -> {"a": 5} - Python booleans: True/False -> true/false Returns the parsed JSON object. """ # Try parsing as-is first try: return json.loads(json_str) except: pass # Process character by character with a state machine fixed = [] in_string = False quote_char = None escape_next = False i = 0 while i < len(json_str): char = json_str[i] # Handle escape sequences if escape_next: fixed.append(char) escape_next = False i += 1 continue if char == '\\': fixed.append(char) escape_next = True i += 1 continue # Handle string boundaries if char in ('"', "'"): if not in_string: in_string = True quote_char = char # Convert opening single quote to double if char == "'": char = '"' elif char == quote_char: in_string = False # Convert closing single quote to double if quote_char == "'": char = '"' # Apply fixes outside of strings if not in_string: # Fix True/False with word boundary checks if (i + 3 < len(json_str) and json_str[i:i+4] == "True" and (i+4 == len(json_str) or not json_str[i+4].isalnum() and json_str[i+4] != '_')): fixed.append("true") i += 4 continue if (i + 4 < len(json_str) and json_str[i:i+5] == "False" and (i+5 == len(json_str) or not json_str[i+5].isalnum() and json_str[i+5] != '_')): fixed.append("false") i += 5 continue # Fix parentheses if char == '(': fixed.append('[') i += 1 continue if char == ')': fixed.append(']') i += 1 continue fixed.append(char) i += 1 fixed_json = ''.join(fixed) # Try to parse the fixed JSON try: return json.loads(fixed_json) except json.JSONDecodeError as e: # If still failing, raise an error raise ValueError(f"Could not fix JSON: {e}") |
I extracted the following code from that output:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 | import json def fix_json(json_str): """ Fixes broken JSON objects and returns the parsed object. Fixes: - Incorrect parentheses: (5, 4) -> [5, 4] - Incorrect single quotes: {'a': 5} -> {"a": 5} - Python booleans: True/False -> true/false Returns the parsed JSON object. """ # Try parsing as-is first try: return json.loads(json_str) except: pass # Process character by character with a state machine fixed = [] in_string = False quote_char = None escape_next = False i = 0 while i < len(json_str): char = json_str[i] # Handle escape sequences if escape_next: fixed.append(char) escape_next = False i += 1 continue if char == '\\': fixed.append(char) escape_next = True i += 1 continue # Handle string boundaries if char in ('"', "'"): if not in_string: in_string = True quote_char = char # Convert opening single quote to double if char == "'": char = '"' elif char == quote_char: in_string = False # Convert closing single quote to double if quote_char == "'": char = '"' # Apply fixes outside of strings if not in_string: # Fix True/False with word boundary checks if (i + 3 < len(json_str) and json_str[i:i+4] == "True" and (i+4 == len(json_str) or not json_str[i+4].isalnum() and json_str[i+4] != '_')): fixed.append("true") i += 4 continue if (i + 4 < len(json_str) and json_str[i:i+5] == "False" and (i+5 == len(json_str) or not json_str[i+5].isalnum() and json_str[i+5] != '_')): fixed.append("false") i += 5 continue # Fix parentheses if char == '(': fixed.append('[') i += 1 continue if char == ')': fixed.append(']') i += 1 continue fixed.append(char) i += 1 fixed_json = ''.join(fixed) # Try to parse the fixed JSON try: return json.loads(fixed_json) except json.JSONDecodeError as e: # If still failing, raise an error raise ValueError(f"Could not fix JSON: {e}") |
Running the following program:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 | import json def fix_json(json_str): """ Fixes broken JSON objects and returns the parsed object. Fixes: - Incorrect parentheses: (5, 4) -> [5, 4] - Incorrect single quotes: {'a': 5} -> {"a": 5} - Python booleans: True/False -> true/false Returns the parsed JSON object. """ # Try parsing as-is first try: return json.loads(json_str) except: pass # Process character by character with a state machine fixed = [] in_string = False quote_char = None escape_next = False i = 0 while i < len(json_str): char = json_str[i] # Handle escape sequences if escape_next: fixed.append(char) escape_next = False i += 1 continue if char == '\\': fixed.append(char) escape_next = True i += 1 continue # Handle string boundaries if char in ('"', "'"): if not in_string: in_string = True quote_char = char # Convert opening single quote to double if char == "'": char = '"' elif char == quote_char: in_string = False # Convert closing single quote to double if quote_char == "'": char = '"' # Apply fixes outside of strings if not in_string: # Fix True/False with word boundary checks if (i + 3 < len(json_str) and json_str[i:i+4] == "True" and (i+4 == len(json_str) or not json_str[i+4].isalnum() and json_str[i+4] != '_')): fixed.append("true") i += 4 continue if (i + 4 < len(json_str) and json_str[i:i+5] == "False" and (i+5 == len(json_str) or not json_str[i+5].isalnum() and json_str[i+5] != '_')): fixed.append("false") i += 5 continue # Fix parentheses if char == '(': fixed.append('[') i += 1 continue if char == ')': fixed.append(']') i += 1 continue fixed.append(char) i += 1 fixed_json = ''.join(fixed) # Try to parse the fixed JSON try: return json.loads(fixed_json) except json.JSONDecodeError as e: # If still failing, raise an error raise ValueError(f"Could not fix JSON: {e}") answer = fix_json('''{"a": 5, "b": [3, 4]}''') expected = {"a": 5, "b": [3, 4]} assert answer == expected, f'Wrong answer; got {answer} instead of {expected}' answer = fix_json('''{'a': 5.0, 'b': (True, 4)}''') expected = {"a": 5.0, "b": [True, 4]} assert answer == expected, f'Wrong answer; got {answer} instead of {expected}' answer = fix_json('''{'True': False, 'b()': (3, 4), "c'": []}''') expected = {"True": False, "b()": [3, 4], "c'": []} assert answer == expected, f'Wrong answer; got {answer} instead of {expected}' print('All tests passed') |
All tests passed
Testing if the previous output contains the string All tests passed
: True