不明な構造を持つネストされた JSON のアンマーシャリング
このシナリオでは、キーと値に格納された不明な構造を持つ JSON データを処理します。店。データベースからエントリを取得するときは、最初に、トップレベルの名前空間を処理するために、map[string]*json.RawMessage にアンマーシャリングします。ただし、ネストされたデータをさらにアンマーシャルするには、使用する特定の構造体を決定する必要があります。
1。繰り返しのアンマーシャルの回避:
アンマーシャルを繰り返すと、パフォーマンスに影響を与える可能性があります。ただし、データ構造やアクセスパターンによっては必要となる場合があります。アンマーシャリングの速度が重要な場合は、アンマーシャリングされた結果をキャッシュすることを検討してください。
2.構造体の型の決定:
方法 A: インターフェイスへのアンマーシャル
方法 B: 正規表現
例:
方法A:
<code class="go">type RawData struct { Id string `json:"id"` Type string `json:"type"` RawData []int `json:"rawdata"` Epoch string `json:"epoch"` } // Unmarshal to interface data := make(map[string]interface{}) json.Unmarshal(*objmap["foo"], &data) // Determine struct type switch data["type"] { case "baz": baz := &RawData{} json.Unmarshal(*objmap["foo"], baz) case "bar": bar := &BarData{} json.Unmarshal(*objmap["foo"], bar) } // Custom struct for nested data type BarData struct { Id string `json:"id"` Type string `json:"type"` RawData []QuxData `json:"rawdata"` Epoch string `json:"epoch"` } type QuxData struct{ Key string `json:"key"` Values []int `json:"values` }</code>
メソッド B:
<code class="go">// Regular expression to extract type typeRegex := regexp.MustCompile(`"type": "(.+?)"`) // Get "type" string typeString := string(typeRegex.Find(*objmap["foo"])) // Map of struct types structMap := map[string]interface{}{ "baz": &RawData{}, "bar": &BarData{}, } // Unmarshal to corresponding struct dataStruct := structMap[typeString] json.Unmarshal(*objmap["foo"], dataStruct)</code>
これらのメソッドのいずれかを実装することで、JSON をアンマーシャリングするための正しい構造体を決定できます。 RawMessage を追加すると、ネストされたデータに効率的にアクセスできるようになります。
以上が構造が不明な入れ子になった JSON を効率的にアンマーシャリングするにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。