首頁 > 後端開發 > Golang > 如何在 Go 中將 JSON 資料解組為介面類型?

如何在 Go 中將 JSON 資料解組為介面類型?

Barbara Streisand
發布: 2024-12-20 09:22:11
原創
628 人瀏覽過

How Can I Unmarshal JSON Data into an Interface Type in Go?

解組到介面類型

在 RPC 中,編組到介面類型非常簡單,因為物件是本地的,並且反射器可以識別其底層類型。然而,反編組到介面類型提出了挑戰。

反射器無法確定指派給將接收編組資料的新實例的具體類型。此限制適用於所有編組/解組操作。

為了在某些框架中解決此問題,提供了附加資訊來協助反射器。例如,在 Java Json(jackson) 中,JsonTypeInfo 註解指定類別類型。

在 Go 中,為自訂類型實作 Unmarshaler 介面可以解決此挑戰。考慮以下範例:

import (
    "encoding/json"
    "errors"
    "fmt"
    "log"
)

// RawString is a raw encoded JSON object.
// It implements Marshaler and Unmarshaler and can
// be used to delay JSON decoding or precompute a JSON encoding.
type RawString string

// MarshalJSON returns *m as the JSON encoding of m.
func (m *RawString) MarshalJSON() ([]byte, error) {
    return []byte(*m), nil
}

// UnmarshalJSON sets *m to a copy of data.
func (m *RawString) UnmarshalJSON(data []byte) error {
    if m == nil {
        return errors.New("RawString: UnmarshalJSON on nil pointer")
    }
    *m += RawString(data)
    return nil
}

const data = `{"i":3, "S":{"phone": {"sales": "2223334444"}}}`

type A struct {
    I int64
    S RawString `sql:"type:json"`
}

func main() {
    a := A{}
    err := json.Unmarshal([]byte(data), &a)
    if err != nil {
        log.Fatal("Unmarshal failed", err)
    }
    fmt.Println("Done", a)
}
登入後複製

以上是如何在 Go 中將 JSON 資料解組為介面類型?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

來源:php.cn
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
作者最新文章
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板