ホームページ >バックエンド開発 >Golang >構造体を使用せずに Go で特定の JSON 値を効率的に抽出するにはどうすればよいですか?

構造体を使用せずに Go で特定の JSON 値を効率的に抽出するにはどうすればよいですか?

Linda Hamilton
Linda Hamiltonオリジナル
2024-12-27 12:46:16345ブラウズ

How Can I Efficiently Extract Specific JSON Values in Go Without Using Structs?

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 サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。