本記事では、プログラミング言語GoでJSONを使用する方法を紹介します。
JSONとは?
JSONは、JavaScript Object Notationの略で、広く使われているデータ交換フォーマットです。
JSONは非常に便利なデータ形式で、現在ではほとんどあらゆるところで使用されています。
JSONとGoでサポートされるデータ型
以下は、GoのデフォルトでJSONでサポートされているデータ型です。エンコードされているデフォルトの型は以下の通りです。
- booleanデータには boolを使用します。
- stringは文字列を表します。
- float64は数値データ。
- nil はnull値。
構造体をJSONにMarshalする
Marshalする(Marshaling)とは、データを符号化することです。
GolangのJSONパッケージは、データをJSONにエンコードするためのMarshal関数を持っています。
以下は、データをマーシャル化するコード例です。
package main
import (
"fmt"
"encoding/json"
)
type Book struct {
Name string
Author string
}
func main() {
book := Book{"C++ programming language", "Bjarne Stroutsrup"}
res, err := json.Marshal(book)
if err != nil {
fmt.Println(err)
}
fmt.Println(string(res)) // {"Name":"C++ programming language","Author":"Bjarne Stroutsrup"}
}
GolangでJSONのUnmarshalを行う
UnmarshalはMarshalの反対であり、デコードのことです。
以下のコードでは、JSONをGolangの構造体に変換しています。
package main
import (
"fmt"
"encoding/json"
)
type Game struct {
Name string
Rating float64
}
func main() {
codString := `{"Name": "Call of Duty", "Rating": 8.4}`
var cod Game
err := json.Unmarshal([]byte(codString), &cod)
if err != nil {
fmt.Println(err)
}
fmt.Printf("%+v\n", cod) // {Name:Call of Duty Rating:8.4}
}
GolangにおけるJSON配列
JSONの配列は、スライス型だけでなく、配列のUnmarshalも可能です。
以下のコード例では、どのように行われるかを見ることができます。
package main
import (
"fmt"
"encoding/json"
)
type Software struct {
Name string
Developer string
}
func main() {
softwaresJson := `[{"Name": "AutoCAD","Developer": "Autodesk"},{"Name": "Firefox","Developer": "Mozilla"},{"Name": "Chrome","Developer": "Google"}]`
var softwares []Software
err := json.Unmarshal([]byte(softwaresJson), &softwares)
if err != nil {
fmt.Println(err)
}
fmt.Printf("%v\n", softwares) // [{AutoCAD Autodesk} {Firefox Mozilla} {Chrome Google}]
}
GolangでJSONにスライスする
スライスは簡単にJSONに変換することができます。
package main
import (
"fmt"
"encoding/json"
)
type App struct {
Name string
}
func main() {
apps := []App{
{Name: "Google Play"},
{Name: "Evernote"},
{Name: "Buffer"},
}
appsJson, err := json.Marshal(apps)
if err != nil {
fmt.Println(err)
}
fmt.Println(string(appsJson)) // [{"Name":"Google Play"},{"Name":"Evernote"},{"Name":"Buffer"}]
}
JSONでカスタム属性を設定する
Goでデータを扱うとき、JSONのカスタム属性を設定することができます。それは、すでに与えられている名前の代わりに、JSONにエンコードするときに使用されます。
ここでは、カスタム属性の設定方法を説明します。
type Book struct {
Name string `json:"title"`
Author Author `json:"author"`
}
Golangで構造化されていないJSONをMapに変換する
構造化されていないJSONデータは、Goでマップにデコードすることができます。この例では、マップを使って構造化されていないJSONデータをデコードする方法を紹介します。
package main
import (
"fmt"
"encoding/json"
)
func main() {
unstructuredJson := `{"os": {"Windows": "Windows OS","Mac": "OSX","Linux": "Ubuntu"},"compilers": "gcc"}`
var result map[string]interface{}
json.Unmarshal([]byte(unstructuredJson), &result)
fmt.Println(result["os"]) // map[Linux:Ubuntu Mac:OSX Windows:Windows OS]
}
非構造化データのエンコード
非構造化データをJSONにエンコードするには、マップを使用することができます。
ここでは、その方法を紹介する。
package main
import (
"fmt"
"encoding/json"
)
type Address struct {
Street string
City string
}
type Person struct {
Name string
Address Address
}
func main() {
p := Person{
Name: "Sherlock Holmes",
Address: Address{
"22/b Baker street",
"London",
},
}
str, err := json.Marshal(p)
if err != nil {
fmt.Println(err)
}
fmt.Println(string(str)) // {"Name":"Sherlock Holmes","Address":{"Street":"22/b Baker street","City":"London"}}
}
空のフィールドを無視する
「omitempty」というflagを使うとフィールドが空の場合、データの一部をスキップすることができる。
type book struct {
Name string `json:"Name"`
Author string `json:"Author, omitempty"`
}
JSONのフィールドをスキップする
JSONのエンコード時にフィールドをスキップするには、属性として”-“を使用するだけです。
type User struct {
Name string `json:"Name"`
Password string `json:"-"`
}
まとめ
GolangでJSONを使用するには、柔軟性が多く様々な方法があります。
これらを駆使することで、APIと相互作用するアプリケーションを簡単に書くことができます。