satoshi.inoue's blog

備忘録を兼ねているので、薄い内容の投稿もあります。

Goのencoding/jsonパッケージについて

GoでJSONを扱う場合、encoding/jsonパッケージを使います。

json - The Go Programming Language

デコードするJson

[
  {"id":1, "info":{"name":"United States of America", "capital_city":"Washington D.C."}},
  {"id":2, "info":{"name":"China", "capital_city":"Beijing"}},
  {"id":3, "info":{"name":"Australia", "capital_city":"Canberra"}},
  {"id":4, "info":{"name":"Japan", "capital_city":"Tokyo"}}
]

コード

package main

import (
    "encoding/json"
    "fmt"
    "io/ioutil"
    "log"
)

type Country struct {
    Id       int    `json:"id"`
    Info     struct {
        Name string `json:"name"`
        CapitalCity string `json:"capital_city"`
    } `json:"info"`
}

func main() {
    bytes, err := ioutil.ReadFile("country.json")
    if err != nil {
        log.Fatal(err)
        return
    }
    var countries []Country
    if err := json.Unmarshal(bytes, &countries); err != nil {
        log.Fatal(err)
        return
    }
    for _, country := range countries {
        fmt.Printf("ID: %d, Name: %s, CapitalCity: %s\n", country.Id, country.Info.Name, country.Info.CapitalCity)
    }
}

実行結果

ID: 1, Name: United States of America, CapitalCity: Washington D.C.
ID: 2, Name: China, CapitalCity: Beijing
ID: 3, Name: Australia, CapitalCity: Canberra
ID: 4, Name: Japan, CapitalCity: Tokyo

ちなみに、すべてのフィールドを扱うわけではない場合、構造体のフィールドは省略しても問題ありません。

また
json:"-"とするといかなる場合でもJSONとして出力されなくなり、
json:"id, omitempty"とすると値が空や0、falseのときJSONとして出力されなくなります。