"""Toleranter JSON-Parser für KI-Output — als Text oder aus Dateien. Verkraftet Code-Fences, Drumherum-Text und unescapte Anführungszeichen in Strings (z. B. MiniMax: "Titel „p" geändert"): das letzte `"` vor der Fehlerstelle wird escapet und erneut geparst. """ import json import logging import re from pathlib import Path log = logging.getLogger("creator.jsonio") def parse_json_text(text: str): """Parst JSON aus KI-Output; None bei nicht reparierbarem Input.""" text = re.sub(r"^```(?:json)?\s*|\s*```$", "", (text or "").strip()) start, end = text.find("{"), text.rfind("}") if start == -1 or end <= start: return None candidate = text[start:end + 1] for _ in range(20): try: return json.loads(candidate) except json.JSONDecodeError as e: if not e.msg.startswith(("Expecting ',' delimiter", "Expecting ':' delimiter")): return None q = candidate.rfind('"', 0, e.pos) if q <= 0: return None candidate = candidate[:q] + '\\"' + candidate[q + 1:] except Exception: return None return None def read_json_file(path: Path): """Liest eine JSON-Datei mit derselben Toleranz; None bei fehlend/ungültig.""" if not path.exists(): return None try: data = parse_json_text(path.read_text(encoding="utf-8")) except Exception as e: log.debug("JSON-Datei nicht lesbar: %s (%s)", path, e) return None if data is None: log.debug("JSON-Datei ungültig: %s", path) return data