像这样解组 JSON(我不控制):
{
"states": {
"state": [
{ ...}
]
}
}
Run Code Online (Sandbox Code Playgroud)
进入这样的结构:
type Device struct {
States struct{ State []State }
}
var dev Device
Run Code Online (Sandbox Code Playgroud)
我得到一个丑陋的语法来访问状态:
dev.States.State[0]
Run Code Online (Sandbox Code Playgroud)
我希望能够改变物体,这样我就可以做到
dev.States[0]
Run Code Online (Sandbox Code Playgroud)
这可以通过标签(在上面的示例中省略,因为不需要)或其他方法来完成,或者我是否必须首先解组到像上面这样的结构,然后根据需要手动重新映射到结构?
您所要做的就是实现Unmarshaler接口,只需添加方法UnmarshalJSON(data []byte) error并包含 Unmarshal 之后所需的逻辑即可;如果你想进行逆操作(marshal),只需实现Marshaler接口即可。
type State struct {
Name string `json:"name"`
}
type Device struct {
States []State
}
func (dev *Device) UnmarshalJSON(data []byte) error {
// anonymous struct with the real backbone of the json
tmp := struct {
States struct {
State []State `json:"state"`
} `json:"states"`
}{}
if err := json.Unmarshal(data, &tmp); err != nil {
return err
}
dev.States = tmp.States.State
return nil
}
Run Code Online (Sandbox Code Playgroud)
完整示例: https: //play.golang.org/p/gNpS13ED_i