Spaces:
Running
Running
| from __future__ import annotations | |
| import json | |
| import logging | |
| import re | |
| from typing import Any, List | |
| logger = logging.getLogger(__name__) | |
| def extract_json_blocks(text: str) -> List[Any]: | |
| blocks: List[Any] = [] | |
| stripped = text.strip() | |
| try: | |
| blocks.append(json.loads(stripped)) | |
| return blocks | |
| except json.JSONDecodeError: | |
| pass | |
| pattern = r"```json\s*\n?(.*?)```" | |
| for match in re.findall(pattern, text, re.DOTALL): | |
| stripped = match.strip() | |
| if stripped: | |
| try: | |
| blocks.append(json.loads(stripped)) | |
| except json.JSONDecodeError: | |
| logger.warning("Failed to parse JSON block: %s", stripped[:100]) | |
| if not blocks: | |
| for delim in (("{", "}"), ("[", "]")): | |
| start = text.find(delim[0]) | |
| end = text.rfind(delim[1]) | |
| if start != -1 and end != -1 and end > start: | |
| candidate = text[start : end + 1] | |
| try: | |
| blocks.append(json.loads(candidate)) | |
| except json.JSONDecodeError: | |
| pass | |
| return blocks | |