はじめてのGo―シンプルな言語仕様,型システム,並行処理

第4章 標準パッケージ―JSON,ファイル,HTTP,HTMLを扱う

この記事を読むのに必要な時間:およそ 8.5 分

1章表1で紹介したように,Goは標準パッケージが充実しています。本章では代表的な標準パッケージをとりあげて,JSON,ファイル,HTTP,テンプレートの扱いを解説します。最後はそれらを組み合わせて簡単なHTTPサーバを作成します。

encoding/jsonパッケージ

JSONを扱うためにはencoding/jsonパッケージを用います。主なAPIとして,構造体をJSONに変換するMarshal()と,その逆を行うUnmarshal()が提供されています。

構造体からJSONへの変換

まずは次のような構造体を用意します。

type Person struct {
    ID int
    Name string
    Email string
    Age int
    Address string
    memo string
}

この構造体にデータを代入し,ポインタをjson.Marshal()に渡すだけで,デフォルトのフォーマットでJSON文字列の[]byteを生成できます。

func main() {
    person := &Person{
        ID: 1,
        Name: "Gopher",
        Email: "gopher@example.org",
        Age: 5,
        Address: "",
        memo: "golang lover",
    }
    b, err := json.Marshal(person)
    if err != nil {
        log.Fatal(err)
    }
    fmt.Println(string(b)) // 文字列に変換
}

出力されたJSONは,整形すると次のようになります。

{
  "ID": 1,
  "Name": "Gopher",
  "Email": "gopher@go.org",
  "Age": 5,
  "Address": ""
}

タグ付け

変換されたJSONを見てみると,キーの名前は構造体のフィールド名と同じになっており,小文字で始まるプライベートなフィールドはJSONには含まれていないことがわかります。もし,プライベートではない構造体のフィールドもJSONに出力しないようにしたり,出力されるキーの名前を変えたい場合などは,構造体にタグを記述することで出力をコントロールできます。

encoding/jsonパッケージで使用できるタグは,次のようなものがあります。

`json:"name"` // nameというキーで格納する
`json:"-"` // JSONに格納しない
`json:",omitempty"` // 値が空なら無視
`json:",string"` // 値をJSONとして格納

タグは次のように,フィールドの型定義の後ろに記述します。

type Person struct {
    ID int `json:"id"`
    Name string `json:"name"`
    Email string `json:"-"`
    Age int `json:"age"`
    Address string `json:"address,omitempty"`
    memo string
}

出力結果は次のように変わります。

fmt.Println(string(b))
// {"id":1,"name":"Gopher","age":5}

JSONから構造体への変換

逆にJSONの文字列からデータをマップした構造体を生成するには,json.Unmarshal()を使用します。格納するJSONと,格納先の構造体のポインタを引数として渡すと,タグの定義に従って構造体のフィールドに値が格納されます。

func main() {
    var person Person
    b := []byte(`{"id":1,"name":"Gopher","age":5}`)
    err := json.Unmarshal(b, &person)
    if err != nil {
        log.Fatal(err)
    }

    fmt.Println(person) // {1 Gopher 5 }
}

著者プロフィール

コメント

コメントの記入