多様な型の配列のアンマーシャリング
JSON 処理では、さまざまな要素型を持つ配列のアンマーシャリングが困難な場合があります。この記事では、既知だがソートされていないデータ型を持つ要素で構成される配列のアンマーシャリングの問題について説明します。
任意のデータをデコードするための Go のメソッド
JSON に関する Go の公式ドキュメントで概要が説明されています。エンコードを行うと、json.Unmarshal 関数を使用して任意のデータをインターフェースにデコードできます。{}型アサーションを使用すると、データ型を動的に決定できます。
コードの適応
次のコードの修正バージョンは、このアプローチを示しています。
package main import ( "encoding/json" "fmt" ) var my_json string = `{ "an_array":[ "with_a string", { "and":"some_more", "different":["nested", "types"] } ] }` func IdentifyDataTypes(f interface{}) { switch vf := f.(type) { case map[string]interface{}: fmt.Println("is a map:") for k, v := range vf { switch vv := v.(type) { case string: fmt.Printf("%v: is string - %q\n", k, vv) case int: fmt.Printf("%v: is int - %q\n", k, vv) default: fmt.Printf("%v: ", k) IdentifyDataTypes(v) } } case []interface{}: fmt.Println("is an array:") for k, v := range vf { switch vv := v.(type) { case string: fmt.Printf("%v: is string - %q\n", k, vv) case int: fmt.Printf("%v: is int - %q\n", k, vv) default: fmt.Printf("%v: ", k) IdentifyDataTypes(v) } } } } func main() { fmt.Println("JSON:\n", my_json, "\n") var f interface{} err := json.Unmarshal([]byte(my_json), &f) if err != nil { fmt.Println(err) } else { fmt.Printf("JSON: ") IdentifyDataTypes(f) } }
出力
コードは次を生成します出力:
JSON: { "an_array":[ "with_a string", { "and":"some_more", "different":["nested", "types"] } ] } JSON: is a map: an_array: is an array: 0: is string - "with_a string" 1: is a map: and: is string - "some_more" different: is an array: 0: is string - "nested" 1: is string - "types"
このアプローチにより、配列内の要素タイプの動的な識別と処理が可能になり、アンマーシャリングのニーズに合わせた多用途のソリューションが提供されます。
以上がGo でデータ型が混在した JSON 配列をアンマーシャリングするにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。