Skip to content

Commit 536ca6f

Browse files
committed
fix(JSON处理): 优化JSON字符串清理逻辑,增加控制字符处理
改进JSON解析失败时的处理流程,先尝试直接解析,失败后再进行控制字符清理。使用更简单直接的方法替换控制字符为空格,并压缩多余空格。同时在两个相关文件中保持逻辑一致。
1 parent 6aa6f6c commit 536ca6f

File tree

4 files changed

+59
-1
lines changed

4 files changed

+59
-1
lines changed

dify_sse_node_plugin.difypkg

75.8 KB
Binary file not shown.

manifest.yaml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
version: 0.0.3
1+
version: 0.0.5
22
type: plugin
33
author: tdcktz
44
name: sse_request_tool

tools/dify_chatflow_sse.py

Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -249,6 +249,35 @@ def connect_and_listen(self, max_events: int = 100, max_duration: int = 300) ->
249249
# 第一步:清理JSON字符串中的无效字符
250250
cleaned_body = self.body
251251

252+
# 清理控制字符 - 使用更简单直接的方法
253+
import re
254+
255+
# 方法1:先尝试直接解析,如果失败再进行清理
256+
try:
257+
# 直接尝试解析原始JSON
258+
test_parsed = json_lib.loads(cleaned_body)
259+
logger.debug(f"[JSON处理] 原始JSON解析成功,无需清理")
260+
except json_lib.JSONDecodeError:
261+
logger.debug(f"[JSON处理] 原始JSON解析失败,开始清理控制字符")
262+
263+
# 方法2:移除JSON结构中的格式化字符,保留字符串值内的内容
264+
# 先压缩所有空白字符(包括换行、制表符等)为单个空格
265+
cleaned_body = re.sub(r'\s+', ' ', cleaned_body)
266+
267+
# 然后清理字符串值内的实际控制字符
268+
# 使用简单的字符串替换来处理常见的控制字符
269+
cleaned_body = cleaned_body.replace('\n', ' ') # 换行符替换为空格
270+
cleaned_body = cleaned_body.replace('\r', ' ') # 回车符替换为空格
271+
cleaned_body = cleaned_body.replace('\t', ' ') # 制表符替换为空格
272+
cleaned_body = cleaned_body.replace('\b', ' ') # 退格符替换为空格
273+
cleaned_body = cleaned_body.replace('\f', ' ') # 换页符替换为空格
274+
275+
# 清理多余的空格
276+
cleaned_body = re.sub(r'\s+', ' ', cleaned_body)
277+
cleaned_body = cleaned_body.strip()
278+
279+
logger.debug(f"[JSON处理] 控制字符清理完成")
280+
252281
# 清理不间断空格(\xa0)和其他常见的无效字符
253282
cleaned_body = cleaned_body.replace('\xa0', ' ') # 不间断空格替换为普通空格
254283
cleaned_body = cleaned_body.replace('\u00a0', ' ') # Unicode不间断空格

tools/dify_sse_node_plugin.py

Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -246,9 +246,38 @@ def connect_and_listen(self, max_events: int = 100, max_duration: int = 300) ->
246246
logger.debug(f"[JSON处理] 开始处理JSON body,长度: {len(self.body)}")
247247
logger.debug(f"[JSON处理] 原始body前100字符: {repr(self.body[:100])}")
248248

249+
# 清理控制字符 - 使用更简单直接的方法
250+
import re
251+
249252
# 第一步:清理JSON字符串中的无效字符
250253
cleaned_body = self.body
251254

255+
# 方法1:先尝试直接解析,如果失败再进行清理
256+
try:
257+
# 直接尝试解析原始JSON
258+
test_parsed = json_lib.loads(cleaned_body)
259+
logger.debug(f"[JSON处理] 原始JSON解析成功,无需清理")
260+
except json_lib.JSONDecodeError:
261+
logger.debug(f"[JSON处理] 原始JSON解析失败,开始清理控制字符")
262+
263+
# 方法2:移除JSON结构中的格式化字符,保留字符串值内的内容
264+
# 先压缩所有空白字符(包括换行、制表符等)为单个空格
265+
cleaned_body = re.sub(r'\s+', ' ', cleaned_body)
266+
267+
# 然后清理字符串值内的实际控制字符
268+
# 使用简单的字符串替换来处理常见的控制字符
269+
cleaned_body = cleaned_body.replace('\n', ' ') # 换行符替换为空格
270+
cleaned_body = cleaned_body.replace('\r', ' ') # 回车符替换为空格
271+
cleaned_body = cleaned_body.replace('\t', ' ') # 制表符替换为空格
272+
cleaned_body = cleaned_body.replace('\b', ' ') # 退格符替换为空格
273+
cleaned_body = cleaned_body.replace('\f', ' ') # 换页符替换为空格
274+
275+
# 清理多余的空格
276+
cleaned_body = re.sub(r'\s+', ' ', cleaned_body)
277+
cleaned_body = cleaned_body.strip()
278+
279+
logger.debug(f"[JSON处理] 控制字符清理完成")
280+
252281
# 清理不间断空格(\xa0)和其他常见的无效字符
253282
cleaned_body = cleaned_body.replace('\xa0', ' ') # 不间断空格替换为普通空格
254283
cleaned_body = cleaned_body.replace('\u00a0', ' ') # Unicode不间断空格

0 commit comments

Comments
 (0)