llm-ready-data / app /utils /json_utils.py
light-infer-chat's picture
ok
2ebf97a
Raw
History Blame Contribute Delete
1.13 kB
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