|
@@ -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)
|