我正在尝试将 JSON 解码为一个结构。但是,该结构有一个带有标签的字段。使用反射,我尝试查看标签中是否包含字符串“json”。如果是这样,那么要解码的 json 应该作为字符串简单地解码到字段中。
例子:
const data = `{"I":3, "S":{"phone": {"sales": "2223334444"}}}`
type A struct {
I int64
S string `sql:"type:json"`
}
问题很简单——将 json 中的“S”作为字符串解码到结构 A 中。
这就是我的进步。但我被困在这里。
最佳答案
这是执行此操作的可行方法 - 无需反射。创建一个新类型 RawString
并为其创建 MarshalJSON
和 UnmarshalJSON
方法。 ( 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/