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