Go で変数構造を使用した JSON データをデコードする
サードパーティ ソースからの JSON データを操作する場合、次のようなシナリオに遭遇することは珍しくありません。データの構造は異なる場合があります。これは、構造体を使用して JSON を特定のデータ型にアンマーシャリングする Go プログラムにとって課題となります。
JSON 応答に、「gwrcmd」などの特定のプロパティ内の単一の要素または配列が含まれる場合を考えてみましょう。この例では。 「gwrcmd」が常に単一の要素である場合は、次のような構造体が適しています:
type Response struct { Gwrcmds struct { Gwrcmd struct { Gcmd string Gdata struct { Gip struct { Version string } } } } }
ただし、「gwrcmd」が配列である場合がある場合、アンマーシャリング中にエラーが発生します。
柔軟性を高めるための json.RawMessage の使用
A可変構造の JSON データを処理する一般的なアプローチは json.RawMessage を使用することです。これにより、特定の型を指定せずに任意の JSON 値をキャプチャできます。生の値を取得したら、それを調べて、さらにアンマーシャリングする方法を決定できます。
type Response struct { Gwrcmds struct { Gwrcmd json.RawMessage } }
Response 構造体の UnmarshalJSON メソッドでは、Gwrcmd の内容を検査し、適切な値にアンマーシャリングできます。 type:
func (r *Response) UnmarshalJSON(b []byte) error { if err := json.Unmarshal(b, &r.Gwrcmds); err != nil { return err } if r.Gwrcmds.Gwrcmd[0] == '[' { return json.Unmarshal(r.Gwrcmds.Gwrcmd, &r.Gwrcmds.GwrcmdAsArray) } return json.Unmarshal(r.Gwrcmds.Gwrcmd, &r.Gwrcmds.GwrcmdAsSingle) }
この場合、配列と単一要素のシナリオの両方を、別々のフィールドを作成して処理します。
代替アプローチ
json.RawMessage は柔軟性を提供しますが、データ構造の手動処理が必要であり、あらゆる場合に適しています。代替アプローチには次のものがあります。
最適なアプローチは、アプリケーションの特定の要件とその複雑さによって異なります。 JSON データ。
以上がGo で変数 JSON 構造を効率的に処理するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。