バリアント構造を使用した JSON のデコード
使用しているエンドポイントは、JSON をさまざまな形式 (文字列として、または文字列として返す場合があります) で返します。配列。この矛盾に対処するために、次の質問では、両方のタイプに対応できる Go 構造体を設計するための最良のアプローチを検討します。
質問:
Go を作成するにはどうすればよいですか?変数型 (文字列または文字列の配列) を使用して JSON データをアンマーシャリングできる構造体? 2 つの別々の構造体にデコードする以外に洗練された解決策はありますか?
答え:
より洗練されたアプローチには、JSON をインターフェース タイプにアンマーシャリングすることが含まれます。{}この型に依存しないアプローチにより、さまざまな値の型を動的に処理できます。
この手法を実装するには、次の例に示すように、interface{} 型のフィールドを持つ構造体を作成します。
<code class="go">type Response struct { Message interface{} `json:"message"` }</code>
JSON データをこの構造体にアンマーシャリングする場合、型スイッチまたは型アサーションを使用して、Message フィールドの実際の型を決定できます。これにより、それに応じてデータを処理できます。
実装例は次のとおりです。
<code class="go">func main() { inputs := []string{ `{"message":"Message"}`, `{"message":["ERROR_CODE"]}`, } for _, input := range inputs { var r Response if err := json.Unmarshal([]byte(input), &r); err != nil { panic(err) } switch x := r.Message.(type) { case string: fmt.Println("Success, message:", x) case []interface{}: fmt.Println("Error, code:", x) default: fmt.Println("Something else:", x) } } }</code>
出力:
Success, message: Message Error, code: [ERROR_CODE]
インターフェース{} アプローチを利用すると、次のことが得られます。さまざまなタイプの JSON データを柔軟に処理できるため、コードベースが簡素化されます。
以上が変数タイプ (文字列または文字列の配列) を使用して JSON データをアンマーシャリングする方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。