Go:
JSONを利用する
方法:
Goでは、encoding/json
パッケージがJSONの操作への入口となり、Goのデータ構造をJSONに変換(マーシャリング)する機構と、その逆の変換(アンマーシャリング)を提供します。以下は、始めるための基本的な例です:
エンコード(マーシャリング)
GoのstructをJSONに変換するには、json.Marshal
を使用できます。次のGoのstructを考えてみましょう:
package main
import (
"encoding/json"
"fmt"
"log"
)
type User struct {
ID int `json:"id"`
Username string `json:"username"`
Languages []string `json:"languages"`
}
func main() {
user := User{1, "JohnDoe", []string{"Go", "JavaScript", "Python"}}
userJSON, err := json.Marshal(user)
if err != nil {
log.Fatal(err)
}
fmt.Println(string(userJSON))
}
出力:
{"id":1,"username":"JohnDoe","languages":["Go","JavaScript","Python"]}
デコード(アンマーシャリング)
Goのデータ構造にJSONを解析するには、json.Unmarshal
を使います:
package main
import (
"encoding/json"
"fmt"
"log"
)
func main() {
jsonStr := `{"id":1,"username":"JohnDoe","languages":["Go","JavaScript","Python"]}`
var user User
err := json.Unmarshal([]byte(jsonStr), &user)
if err != nil {
log.Fatal(err)
}
fmt.Printf("%+v\n", user)
}
上記のUser
構造体を用いて、このコードはJSON文字列をUserインスタンスに解析します。
出力:
{ID:1 Username:JohnDoe Languages:[Go JavaScript Python]}
深堀り
Goのencoding/json
パッケージは、JSONの操作における多くの複雑さを抽象化する直感的なAPIを提供しています。Goの開発初期に導入されたこのパッケージは、Goのシンプルさと効率性の哲学を反映しています。しかし、encoding/json
がランタイムで構造体を検査し変更する反射を使用すると、CPU集約的なシナリオでは最適でないパフォーマンスにつながる可能性があります。
json-iterator/go
やffjson
のような代替手段が登場し、静的なマーシャリングおよびアンマーシャリングコードを生成することで、より速いJSON処理を提供しています。しかし、encoding/json
はそのシンプルさ、堅牢性、そして標準ライブラリの一部であるという事実により、最も一般的に使用されるパッケージのままです。これにより、Goのバージョン間での互換性と安定性が保証されます。
比較的遅いパフォーマンスにもかかわらず、使いやすさとGoの型システムとの統合は、ほとんどのアプリケーションにとってencoding/json
を適しています。パフォーマンスが最優先のコンテキストで作業する人々にとって、外部ライブラリの探索が価値があるかもしれませんが、多くの人にとって、標準ライブラリは速度、シンプルさ、および信頼性の間の正しいバランスを提供します。