跳到內容

AsciiJSON

AsciiJSON 將資料序列化為 JSON,但會將所有非 ASCII 字元跳脫為 \uXXXX Unicode 跳脫序列。HTML 特殊字元如 <> 也會被跳脫。結果是回應主體僅包含 7 位元 ASCII 字元。

何時使用 AsciiJSON:

  • 你的 API 使用者需要嚴格的 ASCII 安全回應(例如,無法處理 UTF-8 編碼位元組的系統)。
  • 你需要將 JSON 嵌入僅支援 ASCII 的環境中,例如某些日誌系統或舊版傳輸協定。
  • 你想確保 <>& 等字元被跳脫,以避免 JSON 嵌入 HTML 時的注入問題。

對於大多數現代 API,標準的 c.JSON() 就已足夠,因為它輸出有效的 UTF-8。僅在 ASCII 安全是特定需求時才使用 AsciiJSON

package main
import (
"net/http"
"github.com/gin-gonic/gin"
)
func main() {
router := gin.Default()
router.GET("/someJSON", func(c *gin.Context) {
data := map[string]interface{}{
"lang": "GO语言",
"tag": "<br>",
}
// will output : {"lang":"GO\u8bed\u8a00","tag":"\u003cbr\u003e"}
c.AsciiJSON(http.StatusOK, data)
})
// Listen and serve on 0.0.0.0:8080
router.Run(":8080")
}

你可以使用 curl 測試此端點:

Terminal window
curl http://localhost:8080/someJSON
# Output: {"lang":"GO\u8bed\u8a00","tag":"\u003cbr\u003e"}

注意中文字元 语言 被替換為 \u8bed\u8a00<br> 標籤變成了 \u003cbr\u003e。回應主體可以安全地在任何僅支援 ASCII 的環境中使用。