&、<、>、記号の自動エスケープ
jsonパッケージのMarshal関数(*Encoder.Encodeメソッドも同様)では、
一部ブラウザがjsonに含まれる上記記号をhtmlと誤認しないよう、
下記のように自動でエスケープ処理がされる。
"&" => "\u0026"
"<" => "\u003c"
">" => "\u003e"
自動エスケープを無効にするには、
EncoderのescapeHTMLプロパティをfalseに設定した上で、
Encodeメソッドを呼び出す必要があるヅラ(・Д・)
Encoder公式サイト
サンプル
encode.go
func main(){
specialChars := struct{
Ampersand string `json:"ampersand"`
LeftAngleBracket string `json:"left_angle_bracket"`
RightAngleBracket string `json:"right_angle_bracket"`
}{
Ampersand: "&",
LeftAngleBracket: "<",
RightAngleBracket: ">",
}
// Marshalを用いたJson変換
bytes, _ := json.Marshal(specialChars)
fmt.Println(string(bytes))
// {"ampersand":"\u0026","left_angle_bracket":"\u003c","right_angle_bracket":"\u003e"}
// Encodeを用いたJson変換
encoder := json.NewEncoder(os.Stdout)
// EscapeHTML設定値true(default)
encoder.Encode(specialChars)
// {"ampersand":"\u0026","left_angle_bracket":"\u003c","right_angle_bracket":"\u003e"}
// EscapeHTMLをfalseに設定
encoder.SetEscapeHTML(false)
encoder.Encode(specialChars)
// {"ampersand":"&","left_angle_bracket":"<","right_angle_bracket":">"}
}