Command Palette

Search for a command to run...

フィールドタグを使用して JSON を Go Struct にマッピングする方法

フィールドタグを使用して JSON を Go Struct にマッピングする方法

T
Toolz Team
|Aug 31, 2026|16 分読んでください
GoogleでToolz.devを優先します

データツールコレクションの一部

JSON to Go Struct

JSONをjsonタグ付きのGo struct定義に変換する ネストされたオブジェクトはインライン構造体になり、オブジェクトの配列はマージされ、フィールド名はGo規約に従います。 client-sideを実行します。

JSON to Go Struct を使う

私の本業のほとんどは TypeScript と PHP ですが、ツールのかなりの部分です Toolz.dev そして、その周りに書く小さなサービスは Go です。新しい API クライアントを配線するたびに、同じ壁にぶつかります。目の前に JSON 応答があり、それには Go 構造体が必要です json.Unmarshal に解読します.その構造体を手で書くことは,非常に具体的な方法で面倒です.それは難しいことではなく,ただいじわるであり,いじわるなビットはまさにあなたが間違いを犯すところにあるので,そのサイトに変換器を組み込みました.これがそのガイドです.

tl;dr: ザ ツールツ JSON to Go 構造体 コンバーター JSON ドキュメントを解析し、それを記述する Go 型宣言を放出します。 オブジェクトはインライン構造体になり、オブジェクトの配列は 1 つの構造体にマージされ、すべてのフィールドは a を取得します json:"key" タグ so encoding/json データを正しくマップバックします フィールド名は囲碁の慣例に従っているので id なる ID あんど user_url なる UserURL。 に整数を切り替える int64、 追加 omitempty、ルート型の名前を変更します。 appload、signup なし、オフラインで動作します。

JSON to Go構造体コンバーターとは何ですか?

JSON to Go 構造体コンバーターは、JSON ドキュメントを、それを記述する Go 型宣言に変換するため、標準ライブラリ' s で同じデータをデコードできます encoding/json 構造体を手入力する代わりにパッケージ化します すべてのJSONオブジェクトはGo構造体になり、すべてのフィールドはaを運びます json:"key" 元の名前にマップし直すタグで、スカラー型は値から推測されます。 JSON 文字列になります string、整数 となる int、小数点を持つ数は となる float64、 true あんど false なる bool、そして null なる interface{}。

これが便利な理由は、JSON オブジェクトと Go 構造体が同じ形状、型付き値を持つ名前付きフィールドのセットを記述しますが、Go は静的に型付けされ、JSON はそうではないため、構造体はすべての型を前面に表示する必要があります。サンプル応答からそれらの型を導出することは純粋な力学であり、ネストされたペイロードを介して手作業で行われる力学はバグが存在する場所です。コンバータは決定論的に導出を行い、コンパイルする型ブロックを返します。

問題の2 つの半分についてはっきりさせる価値があります なぜなら、それらはナイーブコンバーターが間違うものだからです 1 つ目は命名です: Goはエクスポートされたフィールドのみをエンコードし、大文字の最初の文字を持つフィールドと、コミュニティのlintルールは共通の初期主義を完全に大文字にしたいタグです 2 つ目は、 json:"..." タグは正確な元のキーを保持する必要があります json.Unmarshal エラーなしで実行時にフィールドを静かにスキップします。どちらかを間違えると、デコードはゼロ値でいっぱいの構造体を返しますが、すべてが正常に見えます。ツールは両方を処理します。

構造体は手書きで書かないか?

これは正直な質問です なぜならフラットな3 フィールドのオブジェクトの場合 構造体の手書きは ツールを開くよりも速いからです コンバータはフラットではないレスポンスで その地位を獲得します ネストされたオブジェクトを持つペイロード オブジェクトの配列 そしてキーの半分が20 フィールドです snake_case そして、いくつかは次のような初期主義です id、 url、そして api_key。

そのような応答で、手書きバージョンには、繰り返しヒットした3 つの失敗モードがあります フィールドのエクスポートを忘れるので、小文字のままです そして encoding/json 入力することを拒否します。フィールドを大文字にしますが、タグは忘れてしまいます UserName と呼ばれる JSON キーを探します UserName そして決して見つかりません user_name。 or you get the nesting wrong, declaring a field as a plain struct when the JSON actually wraps it in a array.これらのどれもコンパイルエラーではありません。これらは欠損データとして表示されるランタイムサプライズであり、そのうちの1 つをデバッグする時間が、構造体全体の生成に費やした時間よりも多く失われます。

コンバータは3 つすべてを取り除きます. すべてのフィールドをエクスポートし, 実際のキーからタグを書き込み, 実際のJSON図形を読み取って構造体と構造体のスライスのどちらかを決定します. 貼り付けるのは何のための型を得るかです.

これが 1 つの表の決定です。

状況 使い なんでや
2 つまたは 3 つのフィールドを持つ平らなオブジェクト 手書きでね 何でも開くより速い
多くのフィールドを持つネストされた API レスポンス JSON to Go 構造体 コンバーター 名前付けとタグは、手書きの構造体が壊れる場所です
TypeScriptと同じ形が必要です JSON から TypeScript コンバータ 同じ推論、異なるターゲット言語
型ではなく、検証スキーマが必要です JSON スキーマジェネレータ 囲碁タイプではなくドラフト-07 ルール

Go フィールド名が JSON キーと異なるのはなぜですか?

これは、初めて人々を上につまずかせるので、隠すよりも説明する価値がある。 Go& #39; s encoding/json マーシャルとアンマーシャルのみをパッケージ化します 輸出されました struct fields、つまり名前が大文字で始まるフィールドを意味します。 のようなJSONキー user_name 未エクスポートにマッピングできません user_name フィールドなので、フィールドの名前をエクスポートするものに変更する必要があります。ツールは各単語の大文字になり、回転します user_name に UserName。

その上に、Go コミュニティ' から始まったルールである lint ツーリングがあります golint そして、次のようなツールで生き続けます staticcheck、共通の頭文字を全て大文字で書きたい。 とした id なる ID、ない Id; user_url なる UserURL、ない UserUrl;そして html_body なる HTMLBody.変換器は、初期主義の標準集合を知っています、 ID、 URL、 API、 HTTP、 JSON、 UUID、および残り、およびそれらを適用するので、出力はあなたのCIがおそらく実行するリンターを渡します。

リネームセーフにするピースがタグです. すべてのフィールドは a を取得します. json:"user_name" 元のキーを正確に保持しているタグなので、実行時に json.Unmarshal JSONキーを読み取ります user_name そしてそれを に書き込みます UserName 名前変更に関係なくフィールド。json と Go に関する Go blog's の記事では、このタグ メカニズムが文書化されており、名前変更されたフィールドが依然として正しくデコードされる理由です。タグがなければ、名前変更された構造体は静かにデコードできません。

オブジェクトの数字や配列はどのように扱われますか?

推論の 2 つの部分は、コンバータの品質が異なる部分であるため、詳しく調べる価値があります。

数字が先です.JSONは単一の数値型ですが,Goはそうではありませんので,ツールは選択しなければなりません.小数部のない値は になります. int、または int64 そのオプションをオンにすると、小数点以下の値になります float64.面白いケースは,それらを混ぜる配列,のような [9.5, 8, 7.2]。 ツールがそれを次のように入力した場合 []int をデコードできなくなります 9.5、なのでスライス全体を に広げます []float64。1 つの要素が広い型を強制する配列は、すべての要素に対して広い型を取得します。これが、すべての値をデコードする唯一の選択肢です。

オブジェクトの配列は、実際のペイロードが面白くなる他の場所です API は、すべてのオブジェクトが同一のキーのセットを持つ配列をほとんど与えません; 1 つの要素がフィールドを持ち、他の要素が省略するか、または nullable フィールドがここに存在し、そこに存在しない場合、ツールが最初の要素のみから構造体を生成した場合、後で表示されるキーをドロップします 代わりに、配列内のすべてのオブジェクトを、任意の要素が持つすべてのキーを含む 1 つの構造体にマージします そして、2 つの要素が同じキーに互換性のないタイプを与える場合、たとえば 1 つの要素に数値が、別の要素に文字列が指定されると、そのフィールドは に戻ります interface{} ツールが間違った推測をしたり、完全に失敗したりするのではなく、その結果、配列全体をデコードできる単一の構造体タイプが得られます。

コンバーターの使い方は?

フローは4 ステップです.JSONオブジェクトや配列を入力ボックスに貼り付けます; 出力の形を最初に見たい場合はサンプルを読み込みます. root型に名前を付けます, といった具合です. User や ApiResponse、そしてツールは、それが書かれるようにコンパイルするように、有効なエクスポートされた囲碁識別子にそれをきれいにします。 を選択します int や int64 整数の場合は、オンにします omitempty 後で構造体がエンコードされて JSON に戻されるときに、ゼロ値のフィールドを省略したい場合は、「変換」をクリックして構造体をコピーします .go ファイル。

JSON が無効な場合、ツールは parser' 自身のエラーメッセージをサイレントに失敗するのではなく報告するので、迷走した末尾のコンマや引用符で囲まれていないキーはすぐに見つかります そして、すべてがブラウザで実行されるため、マシンから離れることなく、プライベートフィールドを含む実際のAPIレスポンスを貼り付けることができます そのクライアント側モデルは、サイトの残りの後ろにあるものと同じです 、で説明されています データプライバシー オンラインツール ガイド.

これは他の JSON ツールとどのように適合しますか?

JSON to Go構造体コンバータは、サイト上のJSONトランスファミリーのメンバーの1 つであり、同じ解析コアを共有しています。 JSONを最初に整理したいとき、 JSON フォーマッタ はインデントして検証します.これは変換する前に行う価値があり,これから入力する図形を読み取ることができます.ターゲット言語が Go ではなく TypeScript であるとき, JSON から TypeScript コンバータ 同じ推論を実行し、インターフェイスを放出します。言語型の代わりに検証契約が必要な場合、 JSON スキーマジェネレータ draft-07 スキーマを生成し、宛先が PHP コードベースの場合は、 JSON から PHP 配列 コンバーター 配列リテラルを書き込みます.

それらすべてを繋ぐスレッドは、JSONを構造のソースとして扱い、その構造をコードベースが話すものすべてに翻訳するというものです。 複数の言語にわたって作業する場合、 Web 開発者ツールキット ラウンドアップは、これらのピースがどのように一緒にスロットされるかを示します コーディング ツール ガイド より幅広いフォーマッタとコンバータのセットをカバーします。

Go サービスの構築から実際に活用された例

これを具体化させてください 少し前に、サードパーティのAPIからデータを引き出し、そのスリム化されたバージョンを再公開する小さなGoサービスを書いていました。 vendor& #39; sレスポンスはネストされたオブジェクト: を持つトップレベルのレコードでした owner サブオブジェクト、a tags 文字列の配列、および a scores 迷惑なことに、フィールドに応じて整数と小数が混合された配列。 struct を手入力すると、 を取得することになります owner ネスティングは正しく、すべてのタグが付けられています snake_case キーを押して、その混合配列をどうするかを決定します。

サンプル応答をコンバーターに貼り付け、リソースにちなんでルート タイプに名前を付け、構造体を取り戻しました Owner インラインネスト構造体として、 Tags のように []string、そして Scores 正しく に広げました []float64。 ザ・ id フィールドは次のように出てきました ID と json:"id" タグなので、リンターを渡して実際のキーをデコードしました。クライアント パッケージにそのままコピーしてロジックに進み、実際に時間を費やしたい場所に移りました。 struct は作業の興味深い部分ではなく、構造体を生成することで作業の一部ではなくなりました。

私がこれらのスポットで手書きの構造体ではなくコンバーターに手を伸ばす理由は怠惰ではなく、機械部品、エクスポート、タグ付け、およびネストが、私が代わりにロジックを考えているときに私が間違って取得するまさに決定論的なツールにそれらをオフロードすることは、構造体が最初のコンパイルで正しいことを意味し、最初の実行で正しいデコード、ネストされたペイロードで本物のデバッグセッションを保存し、構造体も再エンコードされるのを生き残る必要があるとき、私はオンにします omitempty したがって、ゼロ値は出力から遠ざかり、タグは次のように表示されます json:"key,omitempty" その往復の準備ができています.

知っておく価値のある限界は何ですか?

いくつか正直なエッジです 1 つ目は null。 JSON null それ自体では型情報を持たないため、フィールドになります null サンプルでは次のように入力されます interface{}。 ツールがそこに推測できるものは何もない; もしあなたが本当のタイプを知っているなら、貼り付け後にエディタでそれを変更するか、タイプを導き出すことができるようにそのフィールドが本当の値を持つサンプルをコンバータに供給する これはデータの特性であり、ツールの欠点ではありません。

2 つ目は数値精度で、これはこのコンバーターを具体的に解析するのではなく、JSON 解析全般の特性です。 tool は browser' s JSON パーサーで JSON を解析します。これは数値を倍精度フロートとして表すため、およそ 2 から 53 乗を超える整数は解析時に正確性を失い、ツールがそれらを確認する前に生成されます int64 フィールドは十分に広いです 保持します 大きな ID ですが、ID がその大きな裸の JSON 数として到着した場合、解析はすでに丸められています。本当に大きな整数 ID の場合、堅牢な動きはそれらを JSON の文字列として運ぶことであり、これにより正確性が保たれ、フィールドを次のように入力できます string。

3 つ目は、推論はゴスペルではなく出発点であるということです。ツールはサンプルがサポートするタイプを提供しますが、この応答でたまたま整数であるフィールドが実際には無効可能なカウントであること、または a であることを知っているのはあなただけです float64 であるべき a json.Number 精度の低下を避けるため 出力を、石に刻まれた契約ではなく、絞り込んだ正しい初稿として扱います。これは、あらゆる言語で、すべての JSON-to-types ジェネレーターに当てはまります。

最後に、コンバーターはインライン ネストされた構造体を生成します。これにより、形状全体が 1 つの宣言に保持され、ブロックとして貼り付けることができます。これは、生成された構造体にとって最も一般的で読みやすいスタイルであり、Go エコシステムのツールが普及したものです。深く再利用されたサブオブジェクトに対して個別の名前付きタイプを用意したい場合は、インライン バージョンがエディターに入ったら手動で行うリファクターであり、通常は IDE で 5 秒間の抽出が行われます。

よくある質問

JSON to Go構造体コンバーターとは何ですか? JSON to Go struct コンバータは、JSON ドキュメントを、それを記述する Go 型宣言に変換します。各オブジェクトは struct になり、各フィールドは json:"key" を取得します。タグ、および値型は推論されるため、構造体を手書きせずにエンコーディング/json で同じデータのマーシャルを解除できます。

JSONをGo構造体に変換するにはどうすればよいですか? JSON を入力ボックスに貼り付け、ルート タイプの名前を入力し、整数とタグのオプションを選択して、「変換」をクリックします。ツールは、.go ファイルに直接コピーできる json タグを含む Go 構造体定義を出力します。

Go フィールド名が JSON キーと異なるのはなぜですか? Go はエクスポートされたフィールドのみをエンコードするため、各フィールド名は大文字になり、一般的な初期主義は golint に一致するように大文字になります。 json:"..."すべてのフィールドのタグは元のキーを保持するため、json.Unmarshal はフィールドの名前を変更したにもかかわらず、データを正しくマッピングします。

JSON 数値は Go 型にどのようにマッピングされますか? 整数はint、そのオプションを有効にするとint64 になり、小数点以下の数値はfloat64 になります。 配列が同じ位置の整数と小数を混合すると、型はfloat64 に拡大され、すべての値が適合します。

オブジェクトの配列はどのように処理されますか? オブジェクトの配列は、任意の要素が持つすべてのキーを含む単一の構造体にマージされます。 2 つの要素が同じキー互換性のない型を与える場合、そのフィールドは interface{} になるため、構造体は依然として配列全体をカバーします。

Null 値はどうなりますか? JSON null はそれ自体では型情報を与えないため、フィールドは interface{} と入力されます。実際の型を知っている場合は、貼り付け後にエディターで変更するか、型を推測できるように JSON に null 以外の例値を提供します。

私の JSON はどこかにアップロードされていますか? いいえ 変換はデバイス上のJavaScriptを使用してブラウザで完全に行われます。 JSONがアップロード、ログ記録、または保存されることはなく、ページがロードされるとツールはネットワークを切断したまま動作し続けます。

JSON to Go構造体コンバーターは無料ですか? はい. signup なし, watermark なし, usage cap なしで完全に無料です. 個人プロジェクトや商業プロジェクトに必要な数の JSON ドキュメントを Go 構造体に変換します.

Comments

0 comments

0/2000 characters

No comments yet. Be the first to share your thoughts!