任意の JSON フィールドを使用した未知の構造体の拡張
Go では、既知の構造体の JSON 表現にフィールドを追加するには、匿名構造体。ただし、このアプローチは、未知の構造体を扱う場合には適用できません。この記事では、そのようなシナリオで同様の機能を実現する方法について説明します。
動的型生成用の Reflect パッケージ
1 つの解決策は、カスタム構造体を動的に生成するために Reflect パッケージを利用することです。実行時に入力します。このタイプには、ラップされたインターフェイスと同じタイプの匿名フィールドと追加の「追加」フィールドが含まれます。これにより、埋め込み構造体のフィールドのプロモーションが可能になり、適切な JSON 表現が可能になります。
func printInterface(val interface{}) { // Define the new struct type dynamically t2 := reflect.StructOf([]reflect.StructField{ { Name: "X", Anonymous: true, Type: reflect.TypeOf(val), }, { Name: "Extra", Type: reflect.TypeOf(""), }, }) // Create a new instance of the dynamic type v2 := reflect.New(t2).Elem() v2.Field(0).Set(reflect.ValueOf(val)) v2.FieldByName("Extra").SetString("text") // Encode the dynamic type's value to JSON json.NewEncoder(os.Stdout).Encode(v2.Interface()) }
任意の JSON フィールドのダブル マーシャリング
別のアプローチには、インターフェイスのシリアル化が含まれます。結果の JSON を解析してマップにし、「Extra」フィールドを追加して、変更したマップを JSON に再シリアル化します。この方法は単純ですが、複数のシリアル化手順によりパフォーマンスが低下する可能性があります。
func printInterface(val interface{}) error { // Serialize the interface to JSON data, err := json.Marshal(val) if err != nil { return err } // Unmarshal the JSON into a map v2 := map[string]interface{}{} if err := json.Unmarshal(data, &v2); err != nil { return err } // Add the "Extra" field to the map v2["Extra"] = "text" // Serialize the modified map to JSON return json.NewEncoder(os.Stdout).Encode(v2) }
どちらの方法も、JSON 表現内の目的の「追加」フィールドを使用して未知の構造体を効果的に拡張し、構造体を直接操作するシナリオに対応します。実現不可能です。
以上が任意の JSON フィールドを使用して未知の Go 構造体を拡張するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。