ホームページ >バックエンド開発 >Golang >Go で JSON をマーシャリングおよびアンマーシャリングするときにスタック オーバーフローを回避するにはどうすればよいですか?

Go で JSON をマーシャリングおよびアンマーシャリングするときにスタック オーバーフローを回避するにはどうすればよいですか?

Patricia Arquette
Patricia Arquetteオリジナル
2024-12-26 18:52:14640ブラウズ

How to Avoid Stack Overflow When Marshaling and Unmarshaling JSON in Go?

スタック オーバーフローを伴わない JSON のマーシャリングとアンマーシャリング

JSON エンコードでは、UnmarshalJSON メソッド内で json.Unmarshal を呼び出すと、スタック オーバーフローが発生する可能性があります。この問題は、デコーダがカスタム UnmarshalJSON 実装を継続的に検索し、この場合は繰り返し呼び出されるために発生します。

これを回避するための一般的な解決策は、type キーワードを使用して新しい型を作成することです。この新しい型は、元の型のラッパーとして効果的に機能します。元の値を新しい型に変換して json.Unmarshal に渡すことで、スタック オーバーフローを防ぐことができます。

型変換によってデータの表現が変更されないため、このアプローチは効率的です。 Go の仕様に従って、非数値型の変換は、基になる表現を変更せずに型を変更するだけです。

次の例では、数値の Age フィールドを使用して Person 型が定義されています。カスタム UnmarshalJSON メソッドは、経過時間が決して負にならないようにします。

type Person struct {
    Name string `json:"name"`
    Age  int    `json:"age"`
}

func (p *Person) UnmarshalJSON(data []byte) error {
    type person2 Person
    if err := json.Unmarshal(data, (*person2)(p)); err != nil {
        return err
    }

    // Post-processing after unmarshaling
    if p.Age < 0 {
        p.Age = 0
    }
    return nil
}

この手法は、データのシリアル化前に前処理を実行するカスタム マーシャリング (MarshalJSON) メソッドにも適用できます。

覚えておいてくださいカスタム テキスト表現の String() メソッドを定義する場合、誤って使用しないように t と *t を区別することが重要です。デフォルトの文字列表現を変更します。

以上がGo で JSON をマーシャリングおよびアンマーシャリングするときにスタック オーバーフローを回避するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。