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.