logo
GeekFormat

JSON から Go へ

左側にJSONを貼り付けると、右側にGoプロジェクトですぐに使えるstruct型定義が自動生成されます。ブラウザでローカル処理されるため、登録やアップロードは不要です。

関連おすすめ

JSONからGoについて:JSONをGoの強い型付けstructに変換する

JSONからGoは、JSON形式のデータをGo言語のstruct型定義に自動的に変換するプロセスです。JSONはREST API、設定ファイル、メッセージキュー、ログで最も一般的なデータ交換形式であり、Goは強い型付け言語であるため、開発時にはJSONの動的構造をstructにマッピングしてencoding/jsonでデシリアライズする必要がよくあります。特にネストされたオブジェクトを手書きでstructを作成すると、フィールドの漏れや型の間違いが発生しやすいため、このツールはそのような繰り返しの作業を自動化します。

Goのstructは複合データ型であり、`type Name struct { ... }` で宣言されます。各フィールドは名前と型で構成され、フィールド名は他のパッケージからアクセスできるように大文字で始まる必要があります。これは「エクスポート可能な識別子」と呼ばれます。ツールはJSONのフィールド名をPascalCaseのエクスポートフィールド名に自動的に変換します。例えば `user_name` は `UserName` にマッピングされ、元のキーはjsonタグ内に保持されます。

このツールのコア変換はブラウザ内のjsonFormat Web Workerによって実行され、quicktype-coreのGoレンダラーを呼び出して `just-types` と `no-comments` オプションを渡します。プロセス全体はバックエンドサービスに依存しません:入力されたJSONはローカルで解析され、型が推論され、Goコードが生成されて、右側のエディタに表示されます。

型推論はJSONからGoへの標準的なマッピングに従います:文字列は `string`、ブール値は `bool`、整数は `int64`、浮動小数点数は `float64`、配列はスライス `[]T`、オブジェクトは独立したstruct、`null` は `interface{}` にマッピングされます。ネストされたオブジェクトは再帰的に処理され、階層関係が明確に保たれます。

手書きと比較して、ツールによって生成されるコードは「実行可能な最初のドラフト」です。開発者は通常、ルート型名、パッケージ名、フィールド型の精度(int64をintに変更するなど)、ポインタ型を使用するかどうかを微調整するだけで、実際のGoプロジェクトに配置できます。ワンクリックコピーとmodel.goのダウンロードにより、連携やモデリング段階での繰り返しの作業を大幅に削減できます。

ユースケース

  • Goバックエンド開発でREST APIレスポンスJSONをstructに変換し、json.Unmarshalを使用してGin/Echo/Fiberハンドラーの入力パラメータに直接バインドする
  • フロントエンド・バックエンド連携時にPostmanのサンプルレスポンスJSONからGoモデルを素早く生成し、手書きのフィールド定義を削減する
  • サードパーティのWebhookコールバックを連携する際に、ペイロードJSONをGo structに変換してフィールドレベルのアクセスと検証を容易にする
  • Viper/Consul/NacosのJSON設定ファイルをGo型に変換し、map[string]interface{}による弱い型付けのアクセスを置き換える
  • マイクロサービスチームでgRPC/HTTPインターフェースのリクエスト・レスポンス構造を統一し、サンプルJSONを共有のGo型に変換する
  • テストエンジニアがJSONフィクスチャをGo structに変換し、testifyと組み合わせてアサーション駆動テストを行う
  • 運用担当者がELK/Fluentdで収集したJSONログ行を解析し、structを生成した後にGoプログラムで構造化分析を行う
  • クローラーが取得したJSONデータをGo structに変換し、gorm/genやentと組み合わせてデータベースモデルを生成する
  • IoTデバイスから送信されるJSONテレメトリデータをGo structに変換し、エッジゲートウェイプログラムでデシリアライズとフィルタリングを行う
  • Kafka/NATS/RabbitMQから消費したJSONメッセージをGo型に変換し、イベント駆動のコンシューマー実装に使用する
  • SDK開発者がサーバーのサンプルレスポンスJSONをGo structに変換し、クライアントライブラリのtypesパッケージに書き込んでユーザーが参照できるようにする
  • Swagger/OpenAPIドキュメントのサンプルJSONをGo structに変換し、インターフェースドキュメントのコード例として使用する
  • 学生や講師がGoのコースでサンプルJSONをstructに変換し、Goの型システムとjsonタグの使用法をデモンストレーションする
  • データ移行スクリプトでMySQL/PostgreSQLからエクスポートしたJSON行をGo structに変換し、フィールドマッピングと型検証を行う
  • CI/CD設定のJSONをGo structに変換し、Goで記述されたパイプラインツールで設定を強い型付けで読み取れるようにする
  • レガシープロジェクトでmapに基づいて動的に読み取られていたJSONコードを、structに基づく強い型付けのアクセスにリファクタリングする

使い方

  1. 左側のエディタにJSONコンテンツを貼り付けるか、.json/.txtファイルをドラッグ&ドロップでアップロードするか、「サンプル」をクリックして内蔵データを読み込みます。
  2. 約400ms待つと、ツールは自動的に変換を行い、右側に生成されたGo structコードを表示します。
  3. JSONエラーが発生した場合は、「JSONを修復」ボタンをクリックして一般的なフォーマットエラーを自動的に修正し、生成を続行します。
  4. 右側の出力を確認し、「コピー」をクリックしてGoプロジェクトに貼り付けるか、「ダウンロード」をクリックしてmodel.goファイルとして保存します。

特徴

  • ブラウザローカルでGo structを生成:JSONの解析とGoコードの生成はブラウザ内で完結し、元のデータはサーバーにアップロードされません
  • 400msのデバウンスによる自動変換:貼り付けや変更後に手動でクリックする必要はなく、右側にコピー可能なGoコードがリアルタイムで出力されます
  • スマートな型推論:文字列はstring、ブール値はbool、整数はint64、浮動小数点はfloat64、配列はスライス、オブジェクトはstructにマッピングされます
  • ネストされたオブジェクトを自動展開:再帰的に独立したstruct型を生成し、JSONの階層関係を明確に保ちます
  • jsonタグを自動生成:フィールドの後に `json:"元のフィールド名"` タグが付与され、encoding/jsonですぐに使用できます
  • JSONエラーをワンクリック修復:末尾のカンマ、シングルクォート、引用符の欠落などの一般的なフォーマットエラーを自動的に処理し、修復後に生成を続行します
  • 貼り付け/アップロード/サンプルの3つの入力方法に対応:.json/.txtファイルをドラッグ&ドロップでアップロードするか、内蔵のサンプルを読み込むことができます
  • ワンクリックコピーとダウンロード:Goコード全体をクリップボードにコピーするか、model.goファイルとしてダウンロードしてプロジェクトに直接配置できます
  • localStorageによる入力履歴:最近の入力を自動的に保存し、ページを更新したり誤って閉じたりした場合でもすぐに復元できます
  • レスポンシブな分割画面エディタ:左右のパネルの幅は調整可能で、デスクトップでもモバイルでも入力と出力を快適に表示できます

コード例

生成されたstructを使用してJSONをデシリアライズする

go

ツールによって生成されたstructをプロジェクトにコピーした後、encoding/jsonを使用してAPIレスポンスを直接デシリアライズできます。

package main

import (
    "encoding/json"
    "fmt"
)

// 以下代码由 GeekFormat JSON 转 Go 工具生成
type User struct {
    ID      int64    `json:"id"`
    Name    string   `json:"name"`
    Tags    []string `json:"tags"`
    Address Address  `json:"address"`
}

type Address struct {
    City string `json:"city"`
}

func main() {
    data := []byte(`{
        "id": 1,
        "name": "Alice",
        "tags": ["admin", "dev"],
        "address": {"city": "Beijing"}
    }`)

    var u User
    if err := json.Unmarshal(data, &u); err != nil {
        panic(err)
    }

    fmt.Println(u.Name, u.Address.City)
}

フィールドが欠落している可能性のあるJSONを処理する

go

APIによっては一部のフィールドが存在しない場合があります。対応するフィールドをポインタ型に変更するか、omitemptyタグと組み合わせて使用できます。

package main

import "encoding/json"

// 手动将字段改为指针,缺失时值为 nil
type User struct {
    ID      *int64  `json:"id,omitempty"`
    Name    *string `json:"name,omitempty"`
    Email   *string `json:"email,omitempty"`
}

func main() {
    data := []byte(`{"id": 1, "name": "Bob"}`)
    var u User
    json.Unmarshal(data, &u)
    if u.Email == nil {
        println("Email 字段缺失")
    }
}

よくある質問

JSONをGo structに変換するにはどうすればいいですか?

左側の入力ボックスにJSONコンテンツを貼り付けると、ツールは400ms以内に自動的に変換し、右側に生成されたGo structを表示します。また、.json/.txtファイルをドラッグ&ドロップでアップロードするか、「サンプル」をクリックして内蔵データを読み込むこともできます。変換が完了したら、ワンクリックでmodel.goファイルをコピーまたはダウンロードできます。

生成されるGoコードにはjsonタグが含まれますか?

はい、含まれます。このツールはquicktype-coreに基づいてGoコードを生成し、デフォルトで各structフィールドに `json:"元のフィールド名"` タグが付与されるため、encoding/jsonのUnmarshal/Marshalを使用してシリアライズとデシリアライズを直接行うことができます。

JSON配列はGoスライスに変換されますか?

はい、変換されます。JSON配列は要素の型に基づいて対応するスライス型を生成します。例えば `["a","b"]` は `[]string`、`[1,2,3]` は `[]int64`、`[{...},{...}]` は `[]UserItem` のようなカスタム型を生成します。

ネストされたオブジェクトは複数のstructを生成しますか?

はい、生成します。各ネストされたオブジェクトは再帰的に独立したstruct型を生成し、命名はPascalCaseを使用します。例えば `address` オブジェクトは `Address` structを生成し、メインstructでは `Address Address` フィールドを介して参照されます。

null値はどのような型になりますか?

JSONのnull値は通常 `interface{}` と推論されます。これは安全なフォールバック型です。そのフィールドの実際の型がわかっている場合は、JSONにサンプル値を追加して再生成した後、手動で具体的な型に調整できます。

ルートstructの名前をカスタマイズできますか?

はい、できます。ツールはデフォルトでルート型名(Userなど)を使用します。設定でルート型名を変更すると、関連するすべてのサブタイプの命名が同期して更新され、ダウンロードするファイル名もそれに応じて変更されます。

JSONのフォーマットエラーが発生した場合はどうすればいいですか?

ツールはJSONの正当性を自動的に検出します。末尾のカンマ、シングルクォート、引用符の欠落などの一般的なエラーが存在する場合、「JSONを修復」ボタンが表示されます。クリックすると、ツールは自動的に修復を試みてGo structを再生成します。修復できない場合は、具体的なエラー位置が表示されます。

データはサーバーにアップロードされますか?プライバシーは安全ですか?

いいえ、アップロードされません。JSONの解析、型推論、Goコードの生成はすべてブラウザ内でWeb Workerを介して行われ、入力コンテンツと生成されたコードがサーバーにアップロードされたり、クラウドに記録されたりすることはありません。APIキー、トークン、ビジネスデータを含む機密性の高いJSONでも安心して使用できます。

生成されたコードをGoプロジェクトに直接配置して使用できますか?

はい、できます。生成されるコードは標準的なGo structで、jsonタグが付いているため、プロジェクトのtypes/またはmodels/ディレクトリに直接コピーして使用できます。プロジェクトの命名規則に合わせて、型名やパッケージ名を微調整することを推奨します。

このツールは有料ですか?登録は必要ですか?

完全に無料で、登録やログインは不要です。ページを開くとすぐに使用でき、機能制限、ウォーターマーク、強制的なログインはありません。

どのくらいの大きさのJSONファイルに対応していますか?

ツールには厳密なファイルサイズ制限はありませんが、変換速度とレンダリングパフォーマンスはブラウザとデバイスのパフォーマンスに依存します。最高の体験を得るために、1MB以内のJSONを処理することを推奨します。超大きなJSONは、事前にJSONフォーマッターや分割ツールで処理することができます。

数値型はすべてfloat64になりますか?

いいえ、なりません。ツールは整数と浮動小数点数を区別します:整数フィールドはint64を生成し、浮動小数点フィールドはfloat64を生成します。int、uint64などのより具体的な型を使用したい場合は、生成後に手動で置き換えることができます。

トラブルシューティング

右側に「JSONデータを入力してください」と表示される

左側の入力ボックスが空であるか、空白文字のみが含まれています。有効なJSONを貼り付けるか、「サンプル」をクリックしてデータを読み込むか、.json/.txtファイルをドラッグ&ドロップでアップロードしてください。

JSON解析エラーが表示されるがエラー位置が見つからない

入力ボックスの下にある「JSONを修復」ボタンをクリックすると、ツールは末尾のカンマ、シングルクォート、引用符の欠落、JSスタイルのオブジェクトなどの問題を自動的に修復しようとします。修復後、変更された結果がハイライト表示されます。

生成されたフィールド名がGoの命名規則に準拠していない

ツールはJSONキーに基づいてPascalCaseのフィールド名を生成します。キーに日本語や特殊文字が含まれている場合、エスケープされたフィールド名が生成されることがあります。JSONキーを英小文字またはsnake_caseに変更し、生成後に統一的に調整することを推奨します。

nullフィールドがinterface{}として生成されたが、具体的な型に変更したい

nullからは具体的な型を推論できないため、ツールはフォールバックとしてinterface{}を使用します。元のJSONでそのフィールドにサンプル値(""や0など)を指定して再生成した後、string/int64などの実際の型に変更できます。

大きなJSONを変換した後にページがカクつく

ブラウザが超大きなJSONと多数のstructをレンダリングすると、多くのメモリを消費します。推奨事項:① キーとなるフィールドのサンプルJSONのみを保持する;② 複数のオブジェクトに分割してそれぞれ変換する;③ メモリを消費している他のページのタブを閉じる。

配列要素の型が[]interface{}と推論された

配列が空[]であるか要素の型が一致しない場合、ツールはフォールバックとしてinterface{}を使用します。同じ型のサンプル要素を追加するか、生成後に手動で[]string、[]int64などの具体的なスライス型に変更できます。

用語集

struct
Goの複合データ型で、複数のフィールドを1つの型にまとめるために使用されます。このツールが生成するGoコードの主体は、複数のstruct定義です。
slice
Goの動的配列型で、構文は[]Tです。このツールはJSON配列を対応するsliceにマッピングします。例えば[]string、[]int64、[]UserItemなどです。
json tag
Go structフィールドの後のバッククォートで囲まれた文字列で、例えば `json:"user_name"` のようなものです。encoding/jsonによるシリアライズ/デシリアライズ時のフィールド名を指定するために使用されます。このツールはこのタグを自動的に生成します。
interface{}
Goの空のインターフェース型で、任意の値を表すことができます。このツールはJSONのnullに遭遇したり型を特定できない場合に、安全なフォールバックとしてinterface{}を使用します。
PascalCase
各単語の最初の文字を大文字にする命名スタイルで、例えばUserName、AddressCityなどです。Goではエクスポート可能なフィールドは大文字で始まる必要があるため、このツールはJSONフィールド名をPascalCaseに自動的に変換します。
encoding/json
Go標準ライブラリのJSONエンコード/デコードパッケージです。このツールが生成するstructはjsonタグと組み合わせることで、json.Unmarshalとjson.Marshalで直接処理できます。
unmarshal
JSONバイトストリームをGoの値に解析するプロセスです。structを生成した後の最も一般的な使用法は、json.Unmarshal(data, &user)を呼び出すことです。
omitempty
Goのjson tagの一般的なオプションで、例えば `json:"name,omitempty"` のように使用します。フィールドがゼロ値の場合に出力を省略することを示します。このツールはデフォルトでomitemptyを生成しませんが、生成後に必要に応じて手動で追加できます。

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

このツールはJSON値の型に基づいて対応するGo型を自動的に推論します。一般的なマッピング関係は以下の通りです:

JSON値の例生成されるGo型説明
"hello"string文字列は直接マッピング
true / falseboolブール値
42int64小数点のない数値
3.14float64小数点を含む数値
nullinterface{}具体的な型を推論できない場合の安全なフォールバック
["a","b"][]string文字列配列
[1,2,3][]int64整数配列
[{...},{...}][]UserItemオブジェクト配列。要素の型は再帰的に生成
{"id":1}Userオブジェクトは独立したstructを生成

一般的なGo数値型の選択に関する推奨事項

ツールはデフォルトでint64とfloat64を使用します。実際のプロジェクトでは必要に応じて調整できます:

シナリオ推奨される型理由
通常の整数ID、カウントint64ツールのデフォルトと一致し、ほとんどのJSON数値と互換性があります
データベースの自動インクリメント主キーで正の値がわかっている場合uint64負の値を回避し、セマンティクスがより明確になります
32ビットシステムまたは明確に小さい範囲の整数int32メモリ使用量を削減します
価格、緯度経度、科学計算float64ツールのデフォルトと一致し、標準的な浮動小数点精度です
正確な通貨計算decimal.Decimal / intfloat64には精度リスクがあるため、shopspring/decimalまたは分単位のintを使用することを推奨します

Privacy & Security

このJSONからGoツールのすべての処理はブラウザローカルで完全に実行されます:JSONの解析、型推論、Goコードの生成はすべてWeb Workerを介してクライアント側で実行され、入力されたJSONコンテンツ、アップロードされたファイル、生成されたGoコードがサーバーにアップロードされたり、クラウドに記録、キャッシュ、保存されたりすることはありません。ページを閉じるか更新すると、すべての入力と出力のコンテンツはメモリから自動的に消去され、localStorageにのみ最近の入力履歴が保持されます(いつでも消去できます)。APIキー、トークン、機密性の高いビジネスデータを含むJSONの処理に適しています。