AsciiJSON
AsciiJSONはデータをJSONにシリアライズしますが、すべての非ASCII文字を\uXXXXのUnicodeエスケープシーケンスに変換します。<や>などのHTML特殊文字もエスケープされます。結果として、レスポンスボディには7ビットASCII文字のみが含まれます。
AsciiJSONの使用場面:
- API利用者が厳密にASCIIセーフなレスポンスを要求する場合(例:UTF-8エンコードバイトを処理できないシステム)。
- 特定のロギングシステムやレガシートランスポートなど、ASCIIのみをサポートするコンテキストにJSONを埋め込む必要がある場合。
- JSONがHTML内に埋め込まれる際のインジェクション問題を避けるため、
<、>、&などの文字を確実にエスケープしたい場合。
ほとんどのモダンAPIでは、有効なUTF-8を出力する標準のc.JSON()で十分です。AsciiJSONはASCIIの安全性が特定の要件である場合にのみ使用してください。
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>", }
// 出力: {"lang":"GO\u8bed\u8a00","tag":"\u003cbr\u003e"} c.AsciiJSON(http.StatusOK, data) })
// 0.0.0.0:8080でリッスンしてサーブ router.Run(":8080")}curlでこのエンドポイントをテストできます:
curl http://localhost:8080/someJSON# 出力: {"lang":"GO\u8bed\u8a00","tag":"\u003cbr\u003e"}中国語文字の语言が\u8bed\u8a00に、<br>タグが\u003cbr\u003eに置換されていることに注目してください。レスポンスボディはASCIIのみの環境でも安全に利用できます。