encoding/jsonパッケージを利用してJSONをパースしてみます。
例として下記のリンクから取得できるJSONを取得し、userIdを除く、id・title・completed を表示させてみます。※リンクではリクエストパラメータとしてuserId=1を指定しています。
https://jsonplaceholder.typicode.com/todos?userId=1
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
[ { "userId": 1, "id": 1, "title": "delectus aut autem", "completed": false }, { "userId": 1, "id": 2, "title": "quis ut nam facilis et officia qui", "completed": false }, 〜省略 |
最終的に下記のような形式で出力させます。
1 2 3 4 5 6 7 |
id: 1, title: delectus aut autem, completed: false id: 2, title: quis ut nam facilis et officia qui, completed: false id: 3, title: fugiat veniam minus, completed: false 〜省略 id: 18, title: dolorum est consequatur ea mollitia in culpa, completed: false id: 19, title: molestiae ipsa aut voluptatibus pariatur dolor nihil, completed: true id: 20, title: ullam nobis libero sapiente ad optio sint, completed: true |
コード説明
基本的な流れとしては、JSONを格納するための構造体を作成し、実際のJSONデータを読み込み。そのデータ([]byte型)をjson.Unmarshalで構造体に格納します。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 |
package main import ( "encoding/json" "fmt" "io/ioutil" "log" "net/http" ) //Todo is struct type Todo struct { ID int `json:"id"` Title string `json:"title"` Completed bool `json:"completed"` } func main() { url := "https://jsonplaceholder.typicode.com/todos" request, err := http.NewRequest("GET", url, nil) if err != nil { log.Fatal(err) } //クエリパラメータ params := request.URL.Query() params.Add("userId", "1") request.URL.RawQuery = params.Encode() client := http.Client{} response, err := client.Do(request) if err != nil { log.Fatal(err) } defer response.Body.Close() body, err := ioutil.ReadAll(response.Body) if err != nil { log.Fatal(err) } var todos []Todo if err := json.Unmarshal(body, &todos); err != nil { log.Fatal(err) } for _, todo := range todos { fmt.Printf("id: %v, title: %v, completed: %v\n", todo.ID, todo.Title, todo.Completed) } } |
12〜16行目
JSONを格納する構造体を定義しています。id・title・completedのみを利用するのでuserIdは設定していません。つまり全てのキーを記述する必要はありません。「json:"id"
」はタグと呼ばれ、 構造体のフィールドとJSONのキーを対応させるために指定します。ただしフィールド名がキーと同じ(大文字・小文字は関係なし)場合は、特に指定する必要はありません。下記のようにタグを指定しなくてもビルドは通ります。
1 2 3 4 5 |
type Todo struct { ID int Title string Completed bool } |
20〜44行目
GETによるリクエストに関しては下記のページをご覧下さい。
GoでGETによるリクエスト [parameter][http.Get][http.Client]
47行目
json.Unmarshalを利用してTodo構造体に格納しています。bodyは[]byte型であることを確認して下さい。
参照ページ