ツール
入力
結果
結果はここに表示されます。encoding/json でペイロードをアンマーシャルするには、Go 流のフィールド名と、それぞれを元のキーに対応付ける json タグを持つ構造体が先に必要です。このツールは quicktype の Go レンダラーを使い、サンプルからそれらを生成します。stargazers_count は json:"stargazers_count" タグ付きの StargazersCount になり、ネストされたオブジェクトはそれぞれ名前付きの構造体になり、ときどき null になるフィールドはポインターになるので、null とゼロ値を区別できます。出力は package 句と使用する import から始まる完全な Go ファイルです。プロジェクトに追加するときは package main を自分のパッケージ名に変更してください。
動作のしくみ
- フィールド名は Go の頭字語の慣習に従うため、id は ID に、html_url は HTMLURL になり、リンターが期待する形になります。
- すべてのサンプルで整数だった数値は int64 になり、小数の値が 1 つでもあればそのフィールドは float64 になります。
- RFC 3339 のタイムスタンプは time.Time 型になり、encoding/json がカスタムコードなしでパースします。文字列のままにしたい場合は日付の検出をオフにしてください。
- omitempty オプションはすべてのタグに ,omitempty を付けるため、構造体を JSON にマーシャルし直すときにゼロ値が省かれます。
データの行き先
どこにも行きません。このツールは完全にブラウザ内で動作します。貼り付けたテキストはページが処理し、サーバーに送信されることも、ログに記録されることもありません。
このツールは無料で登録不要です。結果は開いているページの中にだけあり、どこにも保存されません。
必要なポイント
このツールは無料です。ログインもポイントも必要ありません。
よくある質問
- 一部のフィールドがポインターになるのはなぜですか?
- Go では、「存在しない、または null」とゼロ値を区別する手段がポインターだからです。GitHub のサンプルにある homepage は、一方のリポジトリでは文字列、もう一方では null なので *string になります。ただの string にすると null が空文字列になってしまい、2 つのケースを区別できなくなります。
- interface{} 型になるフィールドがあるのはなぜですか?
- サンプルの値がすべて null だと推論できる型がないため、何でも受け付ける interface{} のままにしています。実際の型がわかったら置き換えるか、そのフィールドに値が入ったサンプルを含めて生成し直してください。
- mholt/json-to-go と同じものですか?
- やることは同じです。Matt Holt の json-to-go は、この用途で長く使われてきたブラウザツールです。ただしこちらのエンジンは quicktype で、同一の形を 1 つの構造体にまとめ、配列の要素を比較して省略可能なフィールドを判定します。出力のスタイルは十分に近いので、どちらで生成した構造体も同じコードベースになじみます。
- omitempty はオンにすべきですか?
- 空の値が本当に「省略する」ことを意味する場合だけにしてください。omitempty を付けると、マーシャル時に false、0、空文字列が消えるため、false と未指定を区別する API にはリクエストが違う意味で読まれてしまいます。アンマーシャル先としてしか使わない構造体なら、このタグは何も変えません。
背後にあるオープンソース
このツールは glideapps/quicktype(Apache-2.0)の上で動作しています。同じ処理を自分のプログラムに組み込みたい場合は、そのライブラリを使ってください。
glideapps/quicktype別の呼び方
- json go 変換
- json go 構造体 変換
- golang struct 生成
- json struct 変換 オンライン
- go json タグ
- json golang 変換