首页 >后端开发 >Golang >如何在 Go 中将 JSON 数据解组为接口类型?

如何在 Go 中将 JSON 数据解组为接口类型?

Barbara Streisand
Barbara Streisand原创
2024-12-20 09:22:11577浏览

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中文网其他相关文章!

声明:
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn