Go での JSON 値の解析
場合によっては、構造体を使用せずに JSON オブジェクトから特定の値を抽出すると有利です。この記事では、Go でこれを実現する方法を検討し、最初に構造体にアンマーシャリングするという従来のアプローチに代わる方法を提供します。
オプション 1: Map[string]interface{}
Go は、事前定義された構造体なしで JSON 値を保存するための組み込みソリューションを提供します。 json.Unmarshal 関数を使用すると、JSON を map[string]interface{} にデコードできます。キーは JSON フィールド名を表す文字列で、値は Go ネイティブ タイプとして対応する値です。
例:
b := []byte(`{"ask_price": "1.0"}`) data := make(map[string]interface{}) err := json.Unmarshal(b, &data) if err != nil { panic(err) } if price, ok := data["ask_price"].(string); ok { fmt.Println(price) } else { panic("wrong type") }
このアプローチにより、対応する構造体フィールドを必要とせずに、JSON プロパティ名によって必要な特定の値に直接アクセスできます。ただし、取得した値が期待どおりの型であることを確認するには、型アサーションが必要です。
オプション 2: カスタム Unmarshaler
代わりに、カスタム json.Unmarshaler を実装することもできます。ターゲット タイプのインターフェイスを使用して、デコード プロセスをより具体的に処理します。これにより、JSON データを目的の Go 値にアンマーシャリングする方法をより詳細に制御できるようになります。
例:
type AskPrice struct { price string } func (a *AskPrice) UnmarshalJSON(data []byte) error { var v string if err := json.Unmarshal(data, &v); err != nil { return err } a.price = v return nil } // ...
このアプローチでは、対応する構造体フィールドを json:"ask_price" でタグ付けし、& ポインターを使用することでカスタム アンマーシャラーを指定できます。レシーバーは、デコードされた値が構造体フィールドに直接割り当てられるようにします。これにより、明示的な型アサーションの必要性がなくなり、よりカスタマイズされたアンマーシャリング エクスペリエンスが提供されます。
これらのオプションを慎重に検討することで、事前定義された構造体に依存せずに Go で特定の JSON 値を効率的に抽出できます。
以上が構造体を使用せずに Go で特定の JSON 値を効率的に抽出するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。