From 19885f5e0b910869203e8d571d611660f1066704 Mon Sep 17 00:00:00 2001 From: ruoyunbai <19376215@buaa.edu.cn> Date: Mon, 29 Sep 2025 13:59:36 +0800 Subject: [PATCH] fix --- ddms_compliance_suite/input_parser/parser.py | 50 ++++++++++++++++---- 1 file changed, 42 insertions(+), 8 deletions(-) diff --git a/ddms_compliance_suite/input_parser/parser.py b/ddms_compliance_suite/input_parser/parser.py index 045d0ca..8690bef 100644 --- a/ddms_compliance_suite/input_parser/parser.py +++ b/ddms_compliance_suite/input_parser/parser.py @@ -1,4 +1,6 @@ import json +import ast +import re import logging from typing import List, Dict, Any, Optional, Union, Tuple import requests @@ -728,10 +730,26 @@ class InputParser: # 处理JSON字符串形式 if isinstance(candidate, str): - try: - candidate = json.loads(candidate) - except json.JSONDecodeError: - self.logger.warning(f"Schema for '{name}' is a string but not valid JSON; skipping this model.") + candidate_str = candidate.strip() + if candidate_str: + try: + candidate = json.loads(candidate_str) + except json.JSONDecodeError: + fallback_literal = candidate_str + fallback_literal = re.sub(r'\bnull\b', 'None', fallback_literal, flags=re.IGNORECASE) + fallback_literal = re.sub(r'\btrue\b', 'True', fallback_literal, flags=re.IGNORECASE) + fallback_literal = re.sub(r'\bfalse\b', 'False', fallback_literal, flags=re.IGNORECASE) + try: + candidate = ast.literal_eval(fallback_literal) + self.logger.info( + f"Schema for '{name}' parsed using ast.literal_eval fallback after JSON decode failure." + ) + except (ValueError, SyntaxError): + self.logger.warning( + f"Schema for '{name}' is a string but not valid JSON; skipping this model." + ) + candidate = None + else: candidate = None if isinstance(candidate, dict): @@ -741,10 +759,26 @@ class InputParser: else: model = None elif isinstance(raw_model_data, str): - try: - model = json.loads(raw_model_data) - except json.JSONDecodeError: - self.logger.warning(f"Schema for '{name}' returned as string is not valid JSON; skipping this model.") + raw_model_str = raw_model_data.strip() + if raw_model_str: + try: + model = json.loads(raw_model_str) + except json.JSONDecodeError: + fallback_literal = raw_model_str + fallback_literal = re.sub(r'\bnull\b', 'None', fallback_literal, flags=re.IGNORECASE) + fallback_literal = re.sub(r'\btrue\b', 'True', fallback_literal, flags=re.IGNORECASE) + fallback_literal = re.sub(r'\bfalse\b', 'False', fallback_literal, flags=re.IGNORECASE) + try: + model = ast.literal_eval(fallback_literal) + self.logger.info( + f"Schema for '{name}' string parsed using ast.literal_eval fallback after JSON decode failure." + ) + except (ValueError, SyntaxError): + self.logger.warning( + f"Schema for '{name}' returned as string is not valid JSON; skipping this model." + ) + model = None + else: model = None if not isinstance(model, dict):