---
date: 2026-05-11
topic: Gitea API curl POST 中文「全角引号」内嵌 ASCII " 导致 JSON 解析 422
---

## 现象

```bash
curl -X POST -H "Content-Type: application/json" .../comments -d @/tmp/c316.json
# {"message":"[]: jsontext: invalid character '必' after object value (expecting ',' or '}') after offset 1156"}
```

## 根因

写 JSON body 文件时用 heredoc / Write tool 直接拼字符串，body 里出现裸的 `"` 包住中文（如 `"误报 vs 真拦截"`）—— 这些 `"` 在 JSON 里是字符串结束符，不是字面量。JSON 解析器在「误」字 / 「必」字处判定字符串提前关闭，下个字符不是 `,` 或 `}` 就报 422。

## 解决

**永远用 `json.dump(obj, f, ensure_ascii=False)` 生成 Gitea API 的 JSON body**，不要手写 JSON 模板让 Write tool 直接落盘。Python 会自动把 `"` 转义成 `\"`，把 `\n` / `\t` 等正确编码。

```python
import json
body_md = """## 标题
含「误报 vs 真拦截」的描述。
"""
with open('/tmp/x.json','w') as f:
    json.dump({"body": body_md}, f, ensure_ascii=False)
```

## 何时再次出现

- 任何用 curl + `-d @file.json` 调 Gitea / GitHub / Slack API
- body 里含中文，且模板里有意写了 ASCII `"` 当强调引号
- Write tool / heredoc 直接拼 JSON 字符串

经验：API JSON 不要手拼，永远走 `json.dump`。
