未知/任意のキー/値ペアを使用して JSON を構造体にアンマーシャリングすることに関して、同様の質問が多数寄せられています。しかし、見つかった解決策のどれも、これを達成するためのシンプルで洗練された方法を提供していませんでした。
既知のフィールド (常に存在) と未知の数の不明なフィールドを含む JSON 文字列があります。任意のフィールド。例:
<code class="json">{"known1": "foo", "known2": "bar", "unknown1": "car", "unknown2": 1}</code>
この例では、known1 と known2 は既知のフィールドですが、unknown1 とunknown2 は任意のフィールドです。不明なフィールドには、任意の名前 (キー) と値 (文字列、ブール、float64、または int) を指定できます。
私たちの目標は、そのような JSON メッセージを構造体に解析する慣用的な方法を見つけることです。
次の構造体を定義できます:
<code class="go">type Message struct { Known1 string `json:"known1"` Known2 string `json:"known2"` Unknowns []map[string]interface{} }</code>
この構造体を使用すると、サンプル JSON メッセージは次の結果を生成します:
{Known1:foo Known2:bar Unknowns:[map[unknown1:car] map[unknown2:1]]}
別のオプションは、JSON をマップ[文字列]インターフェースにアンマーシャリングすることです。{}:
<code class="go">import ( "encoding/json" "fmt" ) func main() { jsonMsg := `{"known1": "foo", "known2": "bar", "unknown1": "car", "unknown2": 1}` var msg map[string]interface{} fmt.Println(json.Unmarshal([]byte(jsonMsg), &msg)) fmt.Printf("%+v", msg) }</code>
これにより、以下が生成されます。
<nil> map[known1:foo known2:bar unknown1:car unknown2:1]
の利点このアプローチでは、キーと値を反復処理し、データを処理するために必要な型アサーションを実行できます。必要に応じて、構造体にデータを設定する場合としない場合があります。
以上がGo で任意のキーと値のペアを含む JSON を構造体にアンマーシャリングする方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。