通常、配列を含むオブジェクトとして配列を返す API があります。例として次の例を考えてみましょう:
リーリーAPI はこれを数十の場所で毎回異なる名前で実行します。これは 2 つのキーのみで確実に発生します。1 つは number
で、もう 1 つは配列です。
これにより、不必要なレベルのフィールドを常に参照しなければならないため、結果として得られる構造はかなり使いにくくなります。
基本的に、Go インターフェースに次の形式があるかのように見せたいのです:
リーリー 1 つのオプションは、オカレンスごとにカスタム UnmarshalJSON
関数を記述することですが、特にこれがほぼすべての構造に現れることを考えると、これは面倒に思えます。私が思いついた解決策は、それを単独で処理できる汎用タイプです。
私の現在の試みは次のとおりです:
リーリー使用方法は次のとおりです:
リーリーを実行すると次のエラーが発生します:
リーリー UnmarshalJSON
デバッガーが sliceVal
を期待どおりに示しているため、コードの大部分は正しいようです。型 NestedArray[T]
に戻すアンマーシャリング中にエラーが発生しました。
この問題を解決する方法はありますか?私が今やっていることよりも良い方法はありますか?私にはこれが最もクリーンだと思われますが、提案を歓迎します。
メソッド NestedArray[T].UnmarshalJSON はそれ自体を再帰的に呼び出します。内部呼び出しでは、bytes
の JSON オブジェクトが必要ですが、JSON 配列を受け取るため、エラーがスローされます。 NestedArray[T]
ではなく []T
にアンマーシャリングすることで修正されました。
エラーとは関係なく、メソッド NestedArray[T].UnmarshalJSON が不必要なエンコードとデコードを実行しました。 json.RawMessage を使用して修正してください。
これは 2 つの修正を加えたコードです:
リーリー以上が構造体をスライスにアンマーシャリングするためのジェネリック型定義の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。