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

在 `UnmarshalJSON` 中呼叫 `json.Unmarshal` 時如何避免堆疊溢位?

Susan Sarandon
Susan Sarandon原創
2024-12-25 19:18:16835瀏覽

How to Avoid Stack Overflow When Calling `json.Unmarshal` Within `UnmarshalJSON`?

在UnmarshalJSON 中呼叫json.Unmarshal 而不會導致堆疊溢位

問題:

問題:

解決方案:

  1. 要避免在UnmarshalJSON 中呼叫json.Unmarshal 時出現堆疊溢位問題,請使用下列技術:
  2. 使用type 關鍵字建立一個新類型,使其成為原始類型的包裝器類型。
  3. 將原始值型別轉換為包裝型別的實例。
  4. 在包裝類型物件上呼叫 json.Unmarshal 來執行解組。

解組後,對原件執行任何自訂後處理type.

推理:

使用type 關鍵字建立新類型會有效地刪除原始類型中的所有方法。當在解組過程中使用包裝器類型時,JSON 解碼器將找不到自訂的 UnmarshalJSON 實現,並將使用預設的實作。這可以防止堆疊溢位問題。

範例:

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

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

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

考慮Age 欄位的Person 類型:

此技術允許自訂解組後進行後處理,同時避免與呼叫json.Unmarshal 相關的堆疊溢位問題解組JSON。

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

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