Golangでjsonを読み込む

概要

タイトル通りGolangjsonファイルを読み込む

実装

実装のサンプルには言語処理100本ノック 2015jawiki-country.jsonを利用。

パッケージ

import (
    "encoding/json"
    "bufio"
    "fmt"
    "os"
    "io"
)

パッケージはencoding/jsonjsonの処理を行う。
ファイル処理のためにosioを利用する。(io/ioutilGo 1.16より非推奨になったらしい。)

構造体

type Article struct {
    Text    string  `json: "text"`
    Title   string  `json: "title"`
}

Golangではjsonをデコードするために構造体を用意する必要がある。
各行のjson: "hoge"ではjsonのフィールド名を書く。
もし、自分で定義することが難しい場合には下記のサイトにjsonファイルを投げれば、構造体を自動的に作成してくれる。

mholt.github.io

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.Unmarshaljsonファイルのデコードを行い、第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で中身を確認することができる。