Go言語学習17日目:JSONデータを扱ってみた!構造体⇔JSON変換&APIレスポンスにチャレンジ(encoding/json)

Go言語学習もいよいよ17日目
今日はJSONデータの扱い方を学ぼうかと。。

今まではコチラ

kunio-ud-all.com

Xで黒板の文字が適当という返信をいただきました。 GPTに任せすぎましたね。。

  • 構造体 ⇔ JSON の変換
  • APIサーバーでJSONレスポンスを返す

この2つができると、「GoでAPI開発できる感」が一気にアップする気がする。。。


まずは基本:構造体をJSONに変換してみる(Marshal)

Goでは、encoding/json パッケージを使えば、簡単にJSON変換ができるようです。

サンプルコード
package main

import (
    "encoding/json"
    "fmt"
)

type User struct {
    Name  string `json:"name"`
    Age   int    `json:"age"`
    Email string `json:"email"`
}

func main() {
    user := User{"たろう", 30, "taro@example.com"}

    jsonData, err := json.Marshal(user)
    if err != nil {
        fmt.Println("エラー:", err)
        return
    }

    fmt.Println(string(jsonData))
}

実行結果:
{"name":"たろう","age":30,"email":"taro@example.com"}
ポイント
  • json.UnmarshalJSON文字列 → 構造体 に変換
  • 第2引数は「ポインタ型」で渡す(&user)ことに注意!

JSON文字列を構造体に変換する(Unmarshal)

サンプルコード
func main() {
    data := `{"name":"はなこ","age":25,"email":"hanako@example.com"}`

    var user User
    err := json.Unmarshal([]byte(data), &user)
    if err != nil {
        fmt.Println("エラー:", err)
        return
    }

    fmt.Printf("名前: %s|年齢: %d|メール: %s\n", user.Name, user.Age, user.Email)
}

実行結果:
名前: はなこ|年齢: 25|メール: hanako@example.com
ポイント
  • json.UnmarshalJSON文字列 → 構造体 に変換
  • 第2引数は「ポインタ型」で渡す(&user)ことに注意!

応用:APIエンドポイントからJSONを返してみる!

昨日学んだ net/http と組み合わせれば、APIサーバーからJSONレスポンスも簡単に作る。

サンプルコード
package main

import (
    "encoding/json"
    "net/http"
)

type Message struct {
    Status  string `json:"status"`
    Message string `json:"message"`
}

func jsonHandler(w http.ResponseWriter, r *http.Request) {
    w.Header().Set("Content-Type", "application/json")

    res := Message{
        Status:  "success",
        Message: "これはJSONレスポンスです!",
    }

    json.NewEncoder(w).Encode(res)
}

func main() {
    http.HandleFunc("/api/message", jsonHandler)
    http.ListenAndServe(":8080", nil)
}

動作確認

ブラウザまたはcurlでアクセス!

curl http://localhost:8080/api/message
{"status":"success","message":"これはJSONレスポンスです!"}
ポイント
  • w.Header().Set("Content-Type", "application/json") でレスポンスの型を指定
  • json.NewEncoder(w).Encode(res) でそのままJSONを返せる!

今日のまとめ

Go言語17日目の学習ポイント
  • json.Marshal で構造体 → JSON文字列
  • json.Unmarshal で JSON文字列 → 構造体
  • APIエンドポイントからJSONレスポンスを返す方法
  • GoはJSON操作が得意で、標準パッケージだけで完結するのが嬉しい

この記事は広告を含みます。