gpt4 book ai didi

json - 我如何解码 JSON?

转载 作者:IT王子 更新时间:2023-10-29 01:16:38 25 4
gpt4 key购买 nike

我正在尝试将 JSON 解码为一个结构。但是,该结构有一个带有标签的字段。使用反射,我尝试查看标签中是否包含字符串“json”。如果是这样,那么要解码的 json 应该作为字符串简单地解码到字段中。

例子:

const data = `{"I":3, "S":{"phone": {"sales": "2223334444"}}}`
type A struct {
I int64
S string `sql:"type:json"`
}

问题很简单——将 json 中的“S”作为字符串解码到结构 A 中。

这就是我的进步。但我被困在这里。

http://play.golang.org/p/YzrhjuXxGN

最佳答案

这是执行此操作的可行方法 - 无需反射。创建一个新类型 RawString 并为其创建 MarshalJSONUnmarshalJSON 方法。 ( playground )

// 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)
}

我修改了 RawMessage 的实现创建以上内容。

关于json - 我如何解码 JSON?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23798283/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com