Перейти к содержимому

AsciiJSON

AsciiJSON сериализует данные в JSON, но экранирует все не-ASCII символы в Unicode escape-последовательности \uXXXX. Специальные HTML-символы, такие как < и >, также экранируются. Результатом является тело ответа, содержащее только 7-битные ASCII-символы.

Когда использовать AsciiJSON:

  • Ваши потребители API требуют строго ASCII-безопасных ответов (например, системы, которые не могут обрабатывать байты в кодировке UTF-8).
  • Вам нужно встроить JSON в контексты, поддерживающие только ASCII, такие как определённые системы логирования или устаревшие транспорты.
  • Вы хотите убедиться, что символы <, > и & экранированы, чтобы избежать проблем с инъекцией при встраивании JSON в HTML.

Для большинства современных API достаточно стандартного c.JSON(), поскольку он выводит валидный UTF-8. Используйте 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>",
}
// 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:

Окно терминала
curl http://localhost:8080/someJSON
# Output: {"lang":"GO\u8bed\u8a00","tag":"\u003cbr\u003e"}

Обратите внимание, что китайские символы 语言 заменены на \u8bed\u8a00, а тег <br> стал \u003cbr\u003e. Тело ответа безопасно для использования в любой среде, работающей только с ASCII.