From 9eda81d7eb881045b29d307145cc240ad5ed2d52 Mon Sep 17 00:00:00 2001 From: Oleksandr Kozachuk Date: Thu, 30 Mar 2023 15:52:11 +0200 Subject: [PATCH] Improve parse_maybe_json. --- fjerkroa_bot/ai_responder.py | 10 ++++++---- tests/test_main.py | 4 +++- 2 files changed, 9 insertions(+), 5 deletions(-) diff --git a/fjerkroa_bot/ai_responder.py b/fjerkroa_bot/ai_responder.py index 5fdbcd8..5e4bff4 100644 --- a/fjerkroa_bot/ai_responder.py +++ b/fjerkroa_bot/ai_responder.py @@ -30,21 +30,23 @@ def parse_response(content: str) -> Dict: def parse_maybe_json(json_string): + if json_string is None: + return None + json_string = json_string.strip() + try: - # Attempt to parse the string as JSON parsed_json = parse_response(json_string) except Exception: - # If it fails, return the original string unchanged + if json_string.startswith('{') and json_string.endswith('}'): + return parse_maybe_json(json_string[1:-1]) return json_string - # If the parsed JSON is a list or dictionary, concatenate its values as a string if isinstance(parsed_json, (list, dict)): concatenated_values = [] for value in parsed_json.values() if isinstance(parsed_json, dict) else parsed_json: concatenated_values.append(str(value)) return '\n'.join(concatenated_values) - # If the parsed JSON is a string, return it return str(parsed_json) diff --git a/tests/test_main.py b/tests/test_main.py index 54cb5e4..79e1cc7 100644 --- a/tests/test_main.py +++ b/tests/test_main.py @@ -69,12 +69,14 @@ class TestFunctionality(TestBotBase): non_json_string = "This is not a JSON string." self.assertEqual(parse_maybe_json(non_json_string), non_json_string) json_array = '["value1", "value2", "value3"]' - expected_output = "value1\nvalue2\nvalue3" self.assertEqual(parse_maybe_json(json_array), expected_output) json_string = '"value1"' expected_output = 'value1' self.assertEqual(parse_maybe_json(json_string), expected_output) + json_struct = '{"This is a string."}' + expected_output = 'This is a string.' + self.assertEqual(parse_maybe_json(json_struct), expected_output) async def test_on_message_event(self) -> None: async def acreate(*a, **kw):