在go中解组json时调整结构

cai*_*man 5 json go

像这样解组 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)

这可以通过标签(在上面的示例中省略,因为不需要)或其他方法来完成,或者我是否必须首先解组到像上面这样的结构,然后根据需要手动重新映射到结构?

Yan*_*ozo 5

您所要做的就是实现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