Go言語でJSON APIを作る基本!エンコード・デコード例
生徒
「先生、Go言語でJSON形式のデータを扱う方法を教えてください。」
先生
「はい、Goでは標準ライブラリのencoding/jsonを使うと、JSONのエンコードやデコードが簡単にできます。」
生徒
「エンコードとデコードって何ですか?」
先生
「エンコードはGoのデータをJSON形式に変換すること、デコードはJSON形式のデータをGoの構造体に変換することです。」
生徒
「なるほど、それでは具体的な例を見せてもらえますか?」
1. JSON APIの基本構造
JSON APIとは、Web上でデータをやり取りするための仕組みです。Goではhttp.HandleFuncでルートを設定し、json.NewEncoderでデータを返すことで簡単にAPIを作成できます。
package main
import (
"encoding/json"
"net/http"
)
type User struct {
Name string `json:"name"`
Age int `json:"age"`
}
func userHandler(w http.ResponseWriter, r *http.Request) {
user := User{Name: "太郎", Age: 25}
w.Header().Set("Content-Type", "application/json")
json.NewEncoder(w).Encode(user)
}
func main() {
http.HandleFunc("/user", userHandler)
http.ListenAndServe(":8080", nil)
}
このコードでは/userにアクセスすると、JSON形式でユーザー情報が返されます。w.Header().Set("Content-Type", "application/json")は、返すデータの形式をJSONとブラウザに知らせる設定です。
2. JSONのデコード方法
APIでは、クライアントから送られたJSONデータをGoの構造体に変換して扱うことも重要です。これをデコードと呼びます。
func createUserHandler(w http.ResponseWriter, r *http.Request) {
if r.Method == "POST" {
var user User
json.NewDecoder(r.Body).Decode(&user)
w.Header().Set("Content-Type", "application/json")
json.NewEncoder(w).Encode(user)
} else {
http.Error(w, "POSTメソッドでアクセスしてください", http.StatusMethodNotAllowed)
}
}
func main() {
http.HandleFunc("/create-user", createUserHandler)
http.ListenAndServe(":8080", nil)
}
このコードでは、POSTメソッドで送られたJSONデータをuser構造体に変換し、再度JSONとして返しています。これにより、データの受け取りと送信が簡単に行えます。
3. JSON API作成のポイント
- Goの標準ライブラリ
encoding/jsonを使うことで、簡単にJSONのエンコード・デコードが可能。 - 構造体のフィールドに
`json:"フィールド名"`タグを付けると、JSONのキー名を自由に設定できる。 http.HandleFuncでURLごとに処理を設定できるので、複数のAPIを作るのも簡単。- POSTリクエストの処理では
json.NewDecoder(r.Body)を使い、リクエストボディからJSONを読み取る。 - 返すデータは
w.Header().Set("Content-Type", "application/json")でJSON形式であることを明示。
これらのポイントを押さえれば、Go言語で簡単にJSON APIを作成でき、データのやり取りやWebサービス開発に役立てられます。
4. JSONレスポンスの形式を整える
JSON APIを実装する際は、単にデータを返すだけでなく、レスポンスの形式をある程度そろえておくと扱いやすくなります。たとえば、実際の開発では「データ本体」と「結果の状態」を分けて返すケースも多くあります。
このような形式にしておくと、クライアント側で処理結果を判断しやすくなり、API全体の見通しも良くなります。
type Response struct {
Status string `json:"status"`
Data User `json:"data"`
}
func userHandler(w http.ResponseWriter, r *http.Request) {
res := Response{
Status: "success",
Data: User{Name: "太郎", Age: 25},
}
w.Header().Set("Content-Type", "application/json")
json.NewEncoder(w).Encode(res)
}
この例では、ユーザー情報に加えて処理結果を示すstatusを含めています。APIの規模が大きくなるほど、このような整理が役立ちます。
5. デコード時のエラーを意識する
JSONをデコードする際は、必ずしも正しい形式のデータが送られてくるとは限りません。そのため、デコード時のエラーを確認することが重要です。エラーを無視すると、意図しないデータが処理されてしまう可能性があります。
Goでは、Decodeの戻り値としてエラーを受け取れるので、それを使って安全に処理を進めます。
var user User
err := json.NewDecoder(r.Body).Decode(&user)
if err != nil {
http.Error(w, "JSONの形式が正しくありません", http.StatusBadRequest)
return
}
このようにエラー処理を加えることで、JSON APIとしての信頼性が高まり、想定外の入力にも対応しやすくなります。
6. JSON APIを拡張していく考え方
基本的なJSON APIを作れるようになると、次は機能を少しずつ拡張していく段階に入ります。たとえば、複数のユーザーを配列で返したり、条件に応じて返すデータを変えたりといった処理です。
Goでは、スライスと構造体を組み合わせることで、複数データのJSON返却も簡単に実装できます。
users := []User{
{Name: "太郎", Age: 25},
{Name: "花子", Age: 30},
}
w.Header().Set("Content-Type", "application/json")
json.NewEncoder(w).Encode(users)
このように、基本のエンコード・デコードの考え方は変えずに、扱うデータの形だけを広げていくことで、実践的なJSON APIへと発展させることができます。
まとめ
この記事では、Go言語を使ってJSON APIを作成するための基本的な考え方と実装方法について解説してきました。 JSON APIは、Webアプリケーションやスマートフォンアプリ、外部サービスとの連携など、さまざまな場面で使われる重要な仕組みです。 Go言語は標準ライブラリが非常に充実しているため、特別なフレームワークを使わなくても、シンプルなコードでJSONの送受信を実現できます。
まず、JSON APIの基本として、HTTPサーバーを立ち上げ、特定のURLにアクセスされたときに処理を行う方法を確認しました。
http.HandleFuncを使えば、URLごとに処理を分けることができ、APIの構造も直感的に理解できます。
また、レスポンスとしてJSONを返す場合は、encoding/jsonパッケージの
json.NewEncoderを使うことで、構造体をそのままJSON形式に変換できる点が大きな特徴です。
これにより、手作業でJSON文字列を組み立てる必要がなく、ミスも減らせます。
次に、JSONのデコードについて学びました。
APIを作るうえでは、データを返すだけでなく、クライアントから送られてくるJSONデータを受け取って処理することも欠かせません。
Goでは、json.NewDecoder(r.Body)を使うことで、リクエストボディに含まれるJSONを構造体に直接変換できます。
この仕組みを使えば、POSTリクエストで送信されたデータを安全かつ簡潔に扱うことができ、
ユーザー登録やデータ作成用のAPIなど、実用的な機能を実装しやすくなります。
JSON APIを設計する際には、構造体に付けるJSONタグも重要なポイントです。
Goの構造体のフィールド名は大文字から始める必要がありますが、
JSONとして返すキー名は小文字やスネークケースにしたい場面も多くあります。
そのような場合に、`json:"name"`のようなタグを付けることで、
GoのコードとJSONの表現をうまく分離できます。
この工夫によって、APIの仕様が分かりやすくなり、他の開発者やクライアント側との連携もスムーズになります。
また、HTTPメソッドの扱い方も重要です。
GETリクエストは主にデータの取得、POSTリクエストはデータの作成や送信に使われることが多く、
Goではr.Methodを確認することで、リクエストの種類に応じた処理を簡単に分けられます。
想定していないメソッドでアクセスされた場合は、ステータスコードを返してエラーを通知することで、
APIとしての使いやすさや安全性を高めることができます。
以下は、この記事で学んだ内容を整理した、シンプルなJSON APIのサンプルです。 ユーザー情報をJSONで返す基本的な形を、あらためて確認しておきましょう。
type User struct {
Name string `json:"name"`
Age int `json:"age"`
}
func userHandler(w http.ResponseWriter, r *http.Request) {
user := User{Name: "花子", Age: 30}
w.Header().Set("Content-Type", "application/json")
json.NewEncoder(w).Encode(user)
}
このように、Go言語のJSON APIは「構造体を定義する」「エンコード・デコードする」「HTTPでやり取りする」 という基本の流れを押さえるだけで、すぐに実用レベルの実装が可能です。 初心者の方は、まずはこの形をしっかり理解し、小さなAPIから作ってみることをおすすめします。
生徒
「Go言語でJSON APIを作る流れが、だいぶイメージできるようになりました。構造体とJSONが自然につながるのが分かりやすいですね。」
先生
「そうですね。Goは標準ライブラリだけでAPIが作れるので、仕組みを理解しやすいのが強みです。」
生徒
「エンコードとデコードも、難しそうだと思っていましたが、決まった書き方を覚えれば使えそうです。」
先生
「その通りです。最初は構造体とJSONの対応関係を意識すると、理解が早くなりますよ。」
生徒
「これなら、ユーザー登録やデータ取得のAPIも自分で作れそうです。」
先生
「ぜひ挑戦してみてください。小さなJSON APIを作る経験が、Go言語の理解を一気に深めてくれます。」
【超入門】ゼロから始めるGo言語プログラミング:最速で「動くアプリ」を作るマンツーマン指導
「プログラミングの仕組み」が根本からわかる。Go言語でバックエンド開発の第一歩を。
本講座を受講することで、単なる文法の暗記ではなく、「プログラムがコンピュータの中でどう動いているか」という本質的な理解につながります。シンプルながら強力なGo言語(Golang)を通じて、現代のバックエンドエンジニアに求められる基礎体力を最短距離で身につけます。
具体的な開発内容と環境
【つくるもの】
ターミナル(黒い画面)上で動作する「対話型計算プログラム」や、データを整理して表示する「ミニ・ツール」をゼロから作成します。自分の書いたコードが形になる感動を体験してください。
【開発環境】
プロの現場でシェアNo.1のVisual Studio Code (VS Code)を使用します。インストールから日本語化、Go言語用の拡張機能設定まで、現場基準の環境を一緒に構築します。
この60分で得られる3つの理解
「なぜ動くのか」という設定の仕組みを理解し、今後の独学で詰まらない土台を作ります。
データの種類やメモリの概念など、他言語にも通じるプログラミングの本質を学びます。
ただ動くだけでなく、誰が見ても分かりやすい「綺麗なコード」を書くための考え方を伝授します。
※本講座は、将来的にバックエンドエンジニアやクラウドインフラに興味がある未経験者のためのエントリー講座です。マンツーマン形式により、あなたの理解度に合わせて進行します。
初めてのGo言語を一緒に学びましょう!