Explorar o código

修改genai返回单引号json,解析失败问题

zhangliang hai 1 mes
pai
achega
c853c23ce8
Modificáronse 2 ficheiros con 51 adicións e 6 borrados
  1. 6 6
      utils/google_ai_studio.py
  2. 45 0
      utils/json_utils.py

+ 6 - 6
utils/google_ai_studio.py

@@ -10,6 +10,7 @@ from google.generativeai.types import (HarmBlockThreshold, HarmCategory)
 from loguru import logger
 import traceback
 
+from utils.json_utils import parse_general_json
 
 CACHE_DIR = '/app/cache/'
 # CACHE_DIR = '/Users/z/Downloads/'
@@ -56,7 +57,7 @@ class GoogleAI(object):
             response = model.generate_content(
                 contents=[
                     video,
-                    "你是一名专业的短视频分析师,请你输出这个视频的完整口播,只输出文字即可。使用一下JSON格式输出:{'text': string}",
+                    '你是一名专业的短视频分析师,请你输出这个视频的完整口播,只输出文字即可。使用以下JSON格式输出,不要包含任何额外的解释、注释或非JSON文本:{"text": string}',
                 ],
                 stream=False,
                 request_options={
@@ -64,11 +65,10 @@ class GoogleAI(object):
                 },
             )
             # 打印响应内容用于调试
-            logger.info(f"[+]Response text: {response.text}")
-            try:
-                text = orjson.loads(response.text.strip())['text']
-            except orjson.JSONDecodeError as json_error:
-                logger.error(f"[内容分析] JSON解析错误, 响应内容: {response.text}, 错误信息: {json_error}")
+            logger.info(f"[+] 响应内容: {response.text}")
+            # 使用通用 JSON 解析函数解析响应
+            text = parse_general_json(response.text, key='text')
+            if text is None:
                 return
             # text = orjson.loads(response.text.strip())['text']
             genai.delete_file(name=video.name)

+ 45 - 0
utils/json_utils.py

@@ -0,0 +1,45 @@
+import orjson
+from loguru import logger
+import ast
+
+
+
+
+def parse_general_json(response_text, key=None):
+    """
+    通用的 JSON 解析方法,兼容单引号和双引号的 JSON 字符串。
+    优先尝试标准 JSON 解析,失败后尝试处理单引号情况。
+    :param response_text: 待解析的 JSON 字符串
+    :param key: 若指定,则从解析结果中提取该键对应的值,默认为 None
+    :return: 解析结果,如果指定了 key 则返回对应的值,解析失败返回 None
+    """
+    try:
+        # 优先尝试使用 orjson.loads 解析标准 JSON 格式
+        data = orjson.loads(response_text.strip())
+    except orjson.JSONDecodeError:
+        try:
+            # 若 orjson.loads 解析失败,尝试使用 ast.literal_eval 处理单引号情况
+            data = ast.literal_eval(response_text.strip())
+        except (SyntaxError, ValueError) as e:
+            # 记录解析错误信息
+            logger.error(f"JSON 解析错误, 响应内容: {response_text}, 错误信息: {e}")
+            return None
+    if key is not None:
+        try:
+            return data[key]
+        except KeyError:
+            logger.error(f"键 {key} 不存在于解析结果中,响应内容: {response_text}")
+            return None
+    return data
+
+
+if __name__ == '__main__':
+    # 测试正常解析情况 - 标准 JSON(双引号)
+    standard_json = '{"text": "这是标准 JSON 测试内容"}'
+    result_standard = parse_general_json(standard_json, key='text')
+    print("标准 JSON 解析结果:", result_standard)
+
+    # 测试正常解析情况 - 非标准 JSON(单引号)
+    non_standard_json = "{'text': '这是非标准 JSON 测试内容'}"
+    result_non_standard = parse_general_json(non_standard_json, key='text')
+    print("非标准 JSON 解析结果:", result_non_standard)