encoding/jsonのおさらい
JSONをマーシャルおよびアンマーシャルします
「encoding/jsonのおさらい」はCoddyKit上の無料Go Academyレッスンです。 これはレッスン1/4です。 下記で完全なレッスンを無料で読むことができます。その後、ブラウザ内の組み込みコードエディタと24時間対応のAIチューターでハンズオン演習できます。 これはGo Academy学習パスの一部であり、ウェブとCoddyKitアプリ全体で進捗が同期されます。 Go Academyコースには全4レッスンが含まれています。
GoでのJSON
JSONはAPIで最も一般的なデータ形式です。Goの標準パッケージencoding/jsonは、Goの値とJSONテキストを相互に変換します。
Marshal:GoからJSONへ
json.Marshalは、Goの値をJSONのバイトスライスに変換します。表示するには文字列に変換します。
package main
import (
"encoding/json"
"fmt"
)
func main() {
data := map[string]int{"a": 1, "b": 2}
b, _ := json.Marshal(data)
fmt.Println(string(b))
}構造体のマーシャリング
構造体はフィールドごとにマーシャリングされます。公開フィールドがJSONキーになります。
package main
import (
"encoding/json"
"fmt"
)
type User struct {
Name string
Age int
}
func main() {
b, _ := json.Marshal(User{"Ann", 30})
fmt.Println(string(b))
}Unmarshal:JSONからGoへ
json.UnmarshalはJSONバイトを解析してGoの値に変換します。変数に値を格納できるように、ポインタを渡してください。
package main
import (
"encoding/json"
"fmt"
)
type User struct {
Name string
Age int
}
func main() {
var u User
json.Unmarshal([]byte("{\"Name\":\"Bob\",\"Age\":25}"), &u)
fmt.Println(u)
}キー名用のタグ
前に説明したように、jsonタグを使ってキー名を制御します。ここではNameがJSONキーのnameに対応します。
package main
import (
"encoding/json"
"fmt"
)
type User struct {
Name string "json:\"name\""
}
func main() {
b, _ := json.Marshal(User{"Ann"})
fmt.Println(string(b))
}必ずエラーを確認する
MarshalとUnmarshalはどちらもエラーを返します。実際のコードでは決して無視しないでください。不正なJSONやサポートされていない型によってエラーが発生します。
package main
import (
"encoding/json"
"fmt"
)
func main() {
var v int
err := json.Unmarshal([]byte("not json"), &v)
fmt.Println(err)
}マップへのデコード
あらかじめデータの形が分からない場合は、map[string]interface{}にアンマーシャリングします。
package main
import (
"encoding/json"
"fmt"
)
func main() {
var m map[string]interface{}
json.Unmarshal([]byte("{\"x\":1,\"y\":\"hi\"}"), &m)
fmt.Println(m["x"], m["y"])
}スライスと配列
JSON配列はGoのスライスに対応します。スライスをマーシャリングすると、JSON配列になります。
package main
import (
"encoding/json"
"fmt"
)
func main() {
b, _ := json.Marshal([]string{"a", "b", "c"})
fmt.Println(string(b))
}整形表示
json.MarshalIndentは、人間が読みやすい出力になるようインデントを追加します。
package main
import (
"encoding/json"
"fmt"
)
func main() {
data := map[string]int{"a": 1}
b, _ := json.MarshalIndent(data, "", " ")
fmt.Println(string(b))
}数値はfloat64
interface{}にデコードすると、GoではすべてのJSON数値がfloat64になります。intが必要な場合は明示的に変換してください。
package main
import (
"encoding/json"
"fmt"
)
func main() {
var v interface{}
json.Unmarshal([]byte("42"), &v)
fmt.Printf("%T %v\n", v, v)
}ラウンドトリップ
マーシャリングしてからアンマーシャリングすることで、JSONを介してデータをコピーできます。サポートされている型であれば、値はそのまま復元されます。
package main
import (
"encoding/json"
"fmt"
)
func main() {
orig := []int{1, 2, 3}
b, _ := json.Marshal(orig)
var back []int
json.Unmarshal(b, &back)
fmt.Println(back)
}クイックチェック
json.Unmarshalにポインタを渡す必要があるのはなぜですか?
まとめ
encoding/jsonには次の特徴があります。
json.MarshalはGoの値をJSONに変換しますjson.UnmarshalはJSONをポインタが指す値に解析します- タグでキー名を変更でき、interface{}にデコードした数値はfloat64になります
- 必ず返されたエラーを確認します
よくある質問
「encoding/jsonのおさらい」レッスンは無料ですか?
はい。「encoding/jsonのおさらい」の完全なテキストはこのウェブで無料で読めます。インタラクティブに演習し(組み込みコードエディタと24時間対応のAIチューター)、Go Academyコースの残りをアンロックするには、CoddyKit PROにアップグレードしてください。 Go Academyコースには全4レッスンが含まれています。
「encoding/jsonのおさらい」で何を学びますか?
JSONをマーシャルおよびアンマーシャルします ブラウザで直接実行するハンズオンコードでGo Academyを演習し、24時間対応のAIチューターがレッスンを進める中での質問に答えます。
Go Academyを始めるのに経験は必要ですか?
事前経験は必要ありません。CoddyKitのGo Academyは初級者から上級者向けに構成されているため、ここから始めるか最初から始めて、自分のペースで進むことができます。 これはレッスン1/4です。
「encoding/jsonのおさらい」レッスンにはどのくらい時間がかかりますか?
ほとんどのCoddyKitレッスンは約5~10分かかります。各レッスンはコンパクトでインタラクティブなので、着実に進歩し、ウェブとアプリ全体で正確に前回の場所から再開できます。
このGo Academyレッスンでコードを書いて実行できますか?
はい。すべてのGo Academyレッスンに組み込みコードエディタが含まれているため、ブラウザでリアルコードを書いて実行し、即座のAIフィードバックを取得できます。ローカル設定は不要です。
このコースのすべてのレッスン
- encoding/jsonのおさらい
- encoding/xml
- encoding/csv
- gobとバイナリエンコーディング