概要
実装
実装のサンプルには言語処理100本ノック 2015のjawiki-country.jsonを利用。
パッケージ
import ( "encoding/json" "bufio" "fmt" "os" "io" )
パッケージはencoding/json
でjsonの処理を行う。
ファイル処理のためにos
とio
を利用する。(io/ioutil
はGo 1.16より非推奨になったらしい。)
構造体
type Article struct { Text string `json: "text"` Title string `json: "title"` }
Golangではjsonをデコードするために構造体を用意する必要がある。
各行のjson: "hoge"
ではjsonのフィールド名を書く。
もし、自分で定義することが難しい場合には下記のサイトにjsonファイルを投げれば、構造体を自動的に作成してくれる。
jsonの中身が分かっていないあるいは、ネストが深くなってよく分からない場合には、
map[string]interface{}
を使った方法がある。(ここでは書かない)
ファイル処理
f, err := os.Open("jawiki-country.json") if err != nil { fmt.Println("error") }
os
パッケージでファイル処理。
jsonファイルの読み込み
// 1行ずつ処理 r := bufio.NewReader(f) // JSONデコード var jawiki []Article for { b, err := r.ReadBytes('\n') if err == io.EOF { break } var article Article json.Unmarshal([]byte(b), &article) jawiki = append(jawiki, article) }
今回の場合、jsonファイルの中身が特殊だったので、1行ずつファイル処理を行った。
json.Unmarshal
でjsonファイルのデコードを行い、第1引数には[]byte
、第2引数にはstruct
である必要がある。
もし、普通のjsonファイルであれば、
if err := json.Unmarshal(bytes, &jawiki); err != nil { log.Fatal(err) }
で読み込むことができる。
デコードしたファイルの中身の確認
for _, j := range jawiki { fmt.Println(j.Text, j.Title) }
確認方法は単純でforで中身を確認することができる。