JSONからGo構造体変換

JSONからGoの構造体を自動生成

サンプルを試す
ルート構造体名:

JSON入力

Go出力

ローカルで実行 · シークレットの貼り付けも安全
Go構造体がここに表示されます…

JSONからGoの構造体への変換とは?

JSONからGoの構造体への変換は、生のJSONデータをGoの標準ライブラリにあるencoding/jsonパッケージで動作する型定義に変換します。Goは静的型付け言語のため、すべてのJSONフィールドに対して正しい型と、シリアライザーにマッピング先のJSONキーを伝えるstructタグを持つフィールドが必要です。大規模または深くネストされたAPIレスポンスに対してこれらの定義を手書きするのは時間がかかり、ミスが起きやすい作業です。

Go 1.0から仕様で定義されているencoding/jsonパッケージは、リフレクションを使用してJSONキーをエクスポートされた構造体フィールドにマッピングします。デフォルトではマッチングは大文字小文字を区別しませんが、明示的なjson structタグが標準的な実装方法です。これにより曖昧さがなくなり、GoのPascalCase規約を使いながらJSONをcamelCaseやsnake_caseのままにできます。変換ツールはこの作業を自動化します:JSONを読み込み、値からGoの型を推論し、正しいタグを持つ構造体定義を出力します。

Goの型システムはJSONに自然にマッピングできます。文字列はstring、真偽値はbool、整数はint、浮動小数点数はfloat64になります。ネストされたJSONオブジェクトは別々の名前付き構造体になり、配列はスライスになります。唯一のギャップはnullです:Goには汎用のnullable型がないため、null値は通常ポインター型(*string、*int)またはinterface{} になります。生成ツールはこれらすべてをミリ秒で処理します。

JSONからGoの変換ツールを使う理由

JSONからGoの構造体を手書きするということは、波かっこを数え、型を推測し、APIが変わるたびにタグを書き直すことを意味します。変換ツールはその手間を省きます。

即座に型を生成
JSONを貼り付けて1秒以内に正しいGoの構造体定義を取得。手動でのフィールド入力、タグの見落とし、整形の手間は不要です。
🔒
プライバシーファーストな処理
変換はすべてブラウザ上で実行されます。JSONがマシンの外に出ることはありません。APIキー、トークン、ユーザーデータはプライベートのままです。
🏷️
正確なstructタグ
生成されたすべてのフィールドにGoのフィールド名を元のJSONキーにマッピングするjson structタグが含まれます。これによりjson.Unmarshal時のサイレントな不一致を防ぎます。
📦
インストール・サインアップ不要
ページを開いてJSONを貼り付けるだけ。Goのツールチェーンも、インストールするCLIツールも、作成するアカウントも不要です。

JSONからGoの構造体への変換ユースケース

REST APIクライアント開発
サードパーティのREST APIのリクエスト・レスポンス用構造体を生成します。APIドキュメントのサンプルJSONを貼り付けて、http.Clientとjson.NewDecoderで使える型をすぐに取得できます。
gRPCゲートウェイモデル
GoサービスがgRPCとRESTの両方のエンドポイントを公開する場合、JSONペイロードに合わせたGo構造体が必要になります。JSONの形状をprotobuf定義に対応する構造体に変換します。
DevOps設定ファイルの解析
JSON設定ファイル(Terraformの出力、Kubernetesマニフェスト、CI/CDパイプラインの設定)をカスタムツールや自動化スクリプト用に型付きGoの構造体に変換します。
データパイプラインの処理
メッセージキュー(Kafka、RabbitMQ、SQS)やデータレイクからのJSONレコード用にGo構造体を構築します。型付き構造体はスキーマの変更を実行時ではなくコンパイル時に検出します。
テストフィクスチャの準備
JSONテストフィクスチャをテーブル駆動テスト用のGo構造体に変換します。型安全なフィクスチャはmap[string]interface{} アサーションを使った場合よりもテスト失敗の原因を診断しやすくします。
Goの型システムを学ぶ
動的型付け言語から移行した学生や開発者は、慣れ親しんだJSONを貼り付けて、Goが同じデータを明示的な型・ポインター・structタグでどのように表現するかを確認できます。

JSONからGoへの型マッピング

encoding/jsonパッケージはJSONの値をGoの型にマッピングする際に特定のルールに従います。下表はデフォルトのマッピングと一般的な代替型を示しています。「デフォルト」列はほとんどの生成ツールが出力する型です。「代替」列は大きなIDにint64、nullableフィールドにポインター型を使うなど、要件に応じて選択する型を示しています。

JSON型値の例デフォルト代替
string"hello"stringstring
number (integer)42intint64
number (float)3.14float64float64
booleantrueboolbool
nullnullinterface{}*string / *int
object{"k": "v"}structstruct
array of strings["a", "b"][]string[]string
array of objects[{"id": 1}][]Item[]Item
mixed array[1, "a"][]interface{}[]interface{}

Go JSONのstructタグリファレンス

structタグはencoding/jsonがフィールドをシリアライズ・デシリアライズする方法を制御します。jsonタグが圧倒的に一般的ですが、同じフィールドに他のタグ(db、yaml、xml)と組み合わせることもできます。タグの構文はフィールド型の後ろにバッククォートで囲まれた文字列です。以下はencoding/jsonがサポートするjsonタグのオプションです。

タグ動作使用場面
json:"name"Maps struct field to JSON key "name"Always generated
json:"name,omitempty"Omits field from output if zero valueOptional fields
json:"-"Field is never serialized or deserializedInternal fields
json:"name,string"Encodes int/bool as JSON stringString-encoded numbers

json.Unmarshal と json.NewDecoder の違い

GoはJSONのデコードに2つの方法を提供しています:バイトスライス用のjson.Unmarshalとio.Readerストリーム用のjson.NewDecoderです。どちらも同じstructタグのルールを使用しますが、使いどころが異なります。

json.Unmarshal
[]byteを受け取り構造体にデータを読み込みます。io.ReadAllで読み取ったHTTPレスポンスボディ、ファイルの内容、テストフィクスチャなど、すでにメモリ上にあるJSONに適しています。JSONが不正な形式だったり型が一致しない場合はエラーを返します。
json.NewDecoder
io.Readerをラップし、受信したJSONトークンを順次デコードします。HTTPレスポンスボディの直接読み取り、改行区切りJSON(NDJSON)のログ、メモリに全体を読み込みたくない大きなファイルなどのストリーミングソースに適しています。複数オブジェクトのストリームにはMore()とともにDecode()をループで呼び出します。

コード例

以下の例は、JSONから生成したGoの構造体を実際のプログラムで使用する方法と、他の言語から生成する方法を示しています。Goの例は標準ライブラリのencoding/jsonを使用しています。

Go (json.Unmarshal)
package main

import (
	"encoding/json"
	"fmt"
)

type User struct {
	ID       int      `json:"id"`
	Name     string   `json:"name"`
	Email    string   `json:"email"`
	IsActive bool     `json:"is_active"`
	Tags     []string `json:"tags"`
}

func main() {
	data := []byte(`{"id":1,"name":"Alice","email":"alice@example.com","is_active":true,"tags":["admin","editor"]}`)

	var user User
	if err := json.Unmarshal(data, &user); err != nil {
		panic(err)
	}
	fmt.Println(user.Name)  // → Alice
	fmt.Println(user.Tags)  // → [admin editor]
}
JavaScript (fetch + type reference)
// JSON response from API — this is the shape you'd convert to Go:
const res = await fetch("https://api.example.com/users/1");
const user = await res.json();
// user → { "id": 1, "name": "Alice", "email": "alice@example.com" }

// Equivalent Go struct:
// type User struct {
//     ID    int    `json:"id"`
//     Name  string `json:"name"`
//     Email string `json:"email"`
// }
Python (generate Go structs from JSON)
import json

def json_to_go(data: dict, name: str = "Root") -> str:
    lines = [f"type {name} struct {{"]
    type_map = {str: "string", int: "int", float: "float64", bool: "bool"}

    for key, value in data.items():
        go_type = type_map.get(type(value), "interface{}")
        field = key.title().replace("_", "")  # snake_case → PascalCase
        lines.append(f'\t{field} {go_type} `json:"{key}"`')
    lines.append("}")
    return "\n".join(lines)

data = json.loads('{"user_name": "Alice", "age": 30, "verified": true}')
print(json_to_go(data))
# type Root struct {
#     UserName string `json:"user_name"`
#     Age      int    `json:"age"`
#     Verified bool   `json:"verified"`
# }
Go (json.Decoder for streams)
package main

import (
	"encoding/json"
	"fmt"
	"strings"
)

type Event struct {
	Type    string `json:"type"`
	Payload string `json:"payload"`
}

func main() {
	stream := strings.NewReader(`{"type":"click","payload":"btn-1"}
{"type":"scroll","payload":"page-2"}`)

	dec := json.NewDecoder(stream)
	for dec.More() {
		var ev Event
		if err := dec.Decode(&ev); err != nil {
			break
		}
		fmt.Printf("%s: %s\n", ev.Type, ev.Payload)
	}
	// → click: btn-1
	// → scroll: page-2
}

よくある質問

json.Unmarshalとjson.Decodeの違いは何ですか?
json.UnmarshalはJSONドキュメント全体を含む[]byteを受け取り、構造体にデータを読み込みます。json.NewDecoderはio.Readerをラップし、JSONをインクリメンタルにデコードします。io.ReadAllの後などすでにメモリ上にJSONがある場合はUnmarshalを使います。HTTPレスポンスボディ、ファイル、またはペイロード全体をバッファリングせずに処理したいストリーミングソースから直接読み取る場合はNewDecoderを使います。
ペイロードに存在しないJSONフィールドはどのように扱われますか?
JSONフィールドが存在しない場合、対応するGo構造体フィールドはゼロ値のままになります:文字列は""、数値は0、真偽値はfalse、ポインターとスライスはnilです。「フィールドが欠落している」と「フィールドが存在するがゼロ値」を区別する必要がある場合は、*intや*stringのようなポインター型を使用します。nilポインターはフィールドが欠落していることを意味し、ゼロ値を持つnilでないポインターは0または""が明示的に設定されたことを意味します。
JSONのためにGo構造体のフィールドをエクスポート(大文字で始める)する必要があるのはなぜですか?
encoding/jsonパッケージはリフレクションを使って構造体フィールドにアクセスしますが、Goのリフレクションのルールではエクスポートされた(大文字の)フィールドへのアクセスのみが許可されています。フィールドが小文字で始まる場合、encoding/jsonはそれを認識できず、マーシャリングとアンマーシャリングの両方で無言でスキップします。エクスポートされたPascalCaseフィールドを小文字のJSONキーにマッピングするにはjson structタグを使用してください。
Goでsnake_caseのJSONキーを扱うには?
正確なJSONキー名を持つjson structタグを追加します。例えば、JSONフィールド"user_name"はタグ `json:"user_name"` を持つGoフィールドUserNameにマッピングされます。生成ツールはこれを自動的に処理します。encoding/jsonには命名ポリシーを設定するグローバルオプションはなく、各フィールドが独自のタグを宣言する必要があります。
null値を含むJSONをGoに変換できますか?
はい。JSONのnull値はGoのポインター型にマッピングされます。例えば"age": nullのようなフィールドはAge *int `json:"age"` になります。JSON値がnullのとき、Goのポインターはnilになります。値がある場合、Goはintをアロケートしてポインターがそれを参照します。常にnullableなフィールドにはポインターを使うのがGoのイディオマティックなアプローチです。
JSONにGoのintが保持できる最大値を超える数値が含まれている場合はどうなりますか?
Goのintはプラットフォームによってサイズが異なります(32ビットシステムでは32ビット、64ビットシステムでは64ビット)。JavaScriptのタイムスタンプやデータベースIDのような大きな数値にはint64を明示的に使用します。JSON数値に小数点以下がある場合はfloat64を使います。float64の精度を超える数値(大きな金融値など)にはjson.Numberを使用してください。これは文字列表現をそのまま保持し、自分でパースすることができます。
このツールとJSON-to-Go-Structの違いは何ですか?
このツールはencoding/jsonの使用パターンに焦点を当てたGo型定義を生成します:正確なstructタグ、適切な型推論、ネストされた構造体と配列の処理です。このサイトのJSON to Go Structツールは構造体のスキャフォールディングに特化しています。どちらも有効なGoコードを生成します。ワークフローに合った方を使用してください。このページのstructタグリファレンスと型マッピングの表は、どちらの生成ツールを使用する場合でも役立ちます。