From 427ffcc47ffc00ff8a939cf825c400f2832bde6d Mon Sep 17 00:00:00 2001 From: Terry McDonnell Date: Mon, 19 Feb 2024 08:46:17 -0800 Subject: [PATCH] support for number-like strings --- src/json_repair/json_repair.py | 17 ++++++++++------- tests/test_json_repair.py | 8 ++++++++ 2 files changed, 18 insertions(+), 7 deletions(-) diff --git a/src/json_repair/json_repair.py b/src/json_repair/json_repair.py index a0fc267..c836ce3 100644 --- a/src/json_repair/json_repair.py +++ b/src/json_repair/json_repair.py @@ -245,13 +245,16 @@ def parse_number(self) -> Union[float, int, str]: self.index += 1 char = self.get_char_at() if number_str: - if "." in number_str or "e" in number_str or "E" in number_str: - return float(number_str) - elif number_str == "-": - # If there is a stray "-" this will throw an exception, throw away this character - return self.parse_json() - else: - return int(number_str) + try: + if "." in number_str or "e" in number_str or "E" in number_str: + return float(number_str) + elif number_str == "-": + # If there is a stray "-" this will throw an exception, throw away this character + return self.parse_json() + else: + return int(number_str) + except ValueError: + return number_str else: # This is a string then return self.parse_string() diff --git a/tests/test_json_repair.py b/tests/test_json_repair.py index e8da54b..695a7f7 100644 --- a/tests/test_json_repair.py +++ b/tests/test_json_repair.py @@ -191,6 +191,10 @@ def test_repair_json_corner_cases_generate_by_gpt(): # Test with null values assert repair_json('{"key": null}') == '{"key": null}' + # Test with numeric-like values + assert repair_json('{"key": 10-20}') == '{"key": "10-20"}' + assert repair_json('{"key": 1.1.1}') == '{"key": "1.1.1"}' + def test_repair_json_corner_cases_generate_by_gpt_with_objects(): # Test with nested JSON @@ -221,6 +225,10 @@ def test_repair_json_corner_cases_generate_by_gpt_with_objects(): # Test with null values assert repair_json('{"key": null}', True) == {"key": None} + # Test with numeric-like values + assert repair_json('{"key": 10-20}', True) == {"key": "10-20"} + assert repair_json('{"key": 1.1.1}', True) == {"key": "1.1.1"} + def test_repair_json_skip_json_loads(): assert repair_json('{"key": true, "key2": false, "key3": null}', skip_json_loads=True) == '{"key": true, "key2": false, "key3": null}' assert repair_json('{"key": true, "key2": false, "key3": null}', return_objects=True, skip_json_loads=True) == {"key": True, "key2": False, "key3": None}