首頁 >後端開發 >Golang >在 UnmarshalJSON 中使用 json.Unmarshal 時如何避免堆疊溢位?

在 UnmarshalJSON 中使用 json.Unmarshal 時如何避免堆疊溢位?

Barbara Streisand
Barbara Streisand原創
2024-12-19 22:50:15126瀏覽

How to Avoid Stack Overflow When Using json.Unmarshal Inside UnmarshalJSON?

在UnmarshalJSON 函數內部呼叫json.Unmarshal 而不發生堆疊溢位

在自訂」中,呼叫不符, type) 可能會導致堆疊溢位。出現這種情況是因為 JSON 解碼器重複檢查自訂 UnmarshalJSON 實現,從而導致無休止的遞歸。

要避免此問題,請使用 type 關鍵字建立新類型,並使用類型轉換將原始值指派給它。這是可能的,因為新類型將原始類型作為其基礎類型。

範例:

假設我們有一個帶有 Age 欄位的 Person 型別。為了確保 Age 不能為負數,我們可以實作 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
}

在這種方法中,類型 person2 會建立一個沒有方法的新類型,從而防止遞歸。資料解組後,會先指派給 person2 類型,然後指派給原始 Person 類型,以便進行後處理。

測試:

import (
    "encoding/json"
    "fmt"
)

func main() {
    var p *Person
    fmt.Println(json.Unmarshal([]byte(`{"name":"Bob","age":10}`), &p))
    fmt.Println(p)

    fmt.Println(json.Unmarshal([]byte(`{"name":"Bob","age":-1}`), &p))
    fmt.Println(p)
}

輸出:

<nil>
&{Bob 10}
<nil>
&{Bob 0}

這演示瞭如何自定義自訂堆疊溢位。

以上是在 UnmarshalJSON 中使用 json.Unmarshal 時如何避免堆疊溢位?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn