構造体とマップへの JSON デコード
説明したシナリオでは、アプリケーションは、JSON に一致する構造体を含むインターフェースを受け取ります。{}構造体をバイト配列として受け取ります。ただし、JSON デコードすると、結果は予期された構造体ではなくマップになります。
この動作は、json.Unmarshal がポインターを処理する方法によるものです。もともと構造体を保持していたインターフェースを参照することにより、デコード プロセスは基礎となる型を判断できなくなります。{}その結果、目的の構造体の代わりに単純なマップが返されます。
この問題を修正するには、次の 2 つのアプローチが考えられます。
1.インターフェイスの直接キャスト:
構造体へのポインターを抽象インターフェイスとして json.Unmarshal に直接渡します:
<code class="go">var ping interface{} = &Ping{} deserialize([]byte(`{"id":42}`), ping)</code>
2.リフレクションベースのポインター作成:
構造体への直接ポインターが使用できない場合は、リフレクションを利用して新しいポインターを作成し、そのポインターに逆シリアル化し、値をコピーして戻します:
<code class="go">var ping interface{} = Ping{} nptr := reflect.New(reflect.TypeOf(ping)) deserialize([]byte(`{"id":42}`), nptr.Interface()) ping = nptr.Interface()</code>
これらのアプローチのいずれかを採用することで、デコード プロセスで基礎となる構造体を正確に識別し、JSON データからそのフィールドにデータを設定できます。
以上が問題と解決策に焦点を当てた、いくつかのタイトルのオプションを次に示します。 **直接の質問の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。