Go言語で文字列をJSONに含めるときのエスケープ処理を初心者向けに解説
生徒
「Goで文字列をJSONに変換するとき、エスケープって必要ですか?」
先生
「はい、必要です。JSONは文字列の中で特定の文字、例えばダブルクォートやバックスラッシュを特別扱いします。そのまま文字列を入れるとJSONの構造が壊れてしまうことがあります。」
生徒
「なるほど。じゃあ、Goではどうやって安全にJSONに文字列を入れるんですか?」
先生
「Goでは標準パッケージのencoding/jsonを使うと、自動でエスケープしてくれます。手動で行う必要はほとんどありません。」
生徒
「自動でやってくれるなら安心ですね。でも、どんな文字がエスケープされるんですか?」
先生
「JSONでエスケープされる代表的な文字は、ダブルクォート、バックスラッシュ、改行、タブなどです。例えば文字列に\"や\nが含まれている場合、自動的に\\\"や\\nに変換されます。」
1. Go言語で文字列をJSONに変換する基本
Go言語で文字列をJSONに含めるには、encoding/jsonパッケージのMarshal関数を使います。この関数は文字列をJSON形式に変換し、必要な文字を自動でエスケープしてくれます。
package main
import (
"encoding/json"
"fmt"
)
func main() {
str := "Go言語で\"JSON\"を扱う\n例です"
jsonData, _ := json.Marshal(str)
fmt.Println(string(jsonData))
}
"Go言語で\"JSON\"を扱う\n例です"
この例では、文字列内のダブルクォートと改行が自動でエスケープされているのがわかります。
2. 構造体とJSONの組み合わせ
複数のデータをJSONに変換する場合は、構造体を使います。構造体内の文字列フィールドもMarshalで安全にエスケープされます。
package main
import (
"encoding/json"
"fmt"
)
type Person struct {
Name string `json:"name"`
Comment string `json:"comment"`
}
func main() {
p := Person{
Name: "太郎",
Comment: "Go言語は\"便利\"です\n初心者にも優しい",
}
jsonData, _ := json.Marshal(p)
fmt.Println(string(jsonData))
}
{"name":"太郎","comment":"Go言語は\"便利\"です\n初心者にも優しい"}
構造体を使うことで、複数の文字列や数値をまとめてJSONに変換できます。文字列内の特殊文字も自動でエスケープされるので安心です。
3. JSONエスケープの重要性
文字列をそのままJSONに含めると、JSONの構造が壊れたり、予期せぬエラーが発生することがあります。特にダブルクォートや改行、バックスラッシュを含む場合は、必ずMarshalでエスケープ処理を行いましょう。
4. エスケープ処理の手動操作
通常はMarshalで自動処理されますが、文字列だけをエスケープしたい場合はjson.HTMLEscapeやjson.Marshalでバイトスライスに変換して操作する方法もあります。これは高度な操作ですが、特殊文字の処理をカスタマイズしたい場合に便利です。
5. 実務での活用ポイント
API通信やファイル保存などでJSONを扱う際、文字列のエスケープを意識することは重要です。Go言語のencoding/jsonパッケージを使えば、エスケープ処理を自動で行えるため、安全にデータをやり取りできます。また、文字列を直接結合してJSONを作るのは避け、必ずMarshalを使う習慣をつけましょう。