From 2f19c630d8c4bdb9dcc383315d46615324266c3b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E7=96=AF=E7=89=9B?= Date: Sat, 15 Aug 2026 12:31:19 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BF=AE=E5=A4=8D=20=5Fdf=5Fto=5Fjson=5Fpayloa?= =?UTF-8?q?d=20=E5=A4=84=E7=90=86=E5=AD=97=E7=AC=A6=E4=B8=B2=E6=8E=A7?= =?UTF-8?q?=E5=88=B6=E5=AD=97=E7=AC=A6=E5=AF=BC=E8=87=B4=E7=9A=84=20JSON?= =?UTF-8?q?=20=E8=A7=A3=E6=9E=90=E5=A4=B1=E8=B4=A5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 字符串字段去除 ASCII 控制字符 (\x00-\x08 \x0b \x0c \x0e-\x1f \x7f) - 保留 \t \n \r 转义,防止 JSON 解析失败 - 长文本字段如 ORG_PROFILE 的换行不再导致 /fin/company-info 等接口响应解析报错 --- api.py | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/api.py b/api.py index bb9b7ea..e6e74e1 100644 --- a/api.py +++ b/api.py @@ -83,6 +83,7 @@ def _parse_stocks(raw: str) -> tuple[list[str], Optional[dict[str, str]]]: def _df_to_json_payload(df: pd.DataFrame) -> dict: """DataFrame -> JSON-safe dict.""" import math + import re safe = df.copy() # 处理 NaN / NaT / Timestamp / inf -> None for col in safe.columns: @@ -103,6 +104,11 @@ def _df_to_json_payload(df: pd.DataFrame) -> dict: new_row[k] = None else: new_row[k] = v + elif isinstance(v, str): + # 去除 ASCII 控制字符 (除 \t \n \r 外), 防止 JSON 解析失败 + # 长文本字段 (如 ORG_PROFILE) 可能含 \f \v 等非标准换行 + v = re.sub(r'[\x00-\x08\x0b\x0c\x0e-\x1f\x7f]', '', v) + new_row[k] = v else: new_row[k] = v cleaned.append(new_row)