我还在学习Go.我试图将json解组成一个struct.但是,struct有一个带标记的字段.使用反射,我试着看看标签中是否有字符串"json".如果确实如此,那么json to unmarshal应该简单地作为字符串解组到字段中.
例:
const data = `{"I":3, "S":{"phone": {"sales": "2223334444"}}}`
type A struct {
I int64
S string `sql:"type:json"`
}
Run Code Online (Sandbox Code Playgroud)
问题很简单 - 将json中的"S"解组为结构A中的字符串.
这就是我走了多远.但我被困在这里.
Nic*_*ood 11
这是去做的方式 - 不需要反思.创建一个新类型RawString并为其创建MarshalJSON和UnmarshalJSON方法.(游乐场)
// 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)
}
Run Code Online (Sandbox Code Playgroud)
我修改了RawMessage的实现来创建上面的内容.