json - 在go中解码json时调整结构

标签 json go

像这样解码 JSON(我无法控制):

{
    "states": {
        "state": [
            { ...}
        ]
    }
}

进入结构如下:

type Device struct {
    States    struct{ State []State }
}
var dev Device

我得到一个丑陋的语法来访问状态:

dev.States.State[0]

我希望能够转换对象,这样我就可以做

dev.States[0]

这可以用标签来完成吗(在上面的例子中因为不需要而被省略),或者用另一种方法,或者我是否必须首先解码到一个像上面这样的结构然后手动重新映射到我想要的结构?

最佳答案

您所要做的就是实现 Unmarshaler接口(interface)只是添加了方法 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
}

完整示例:https://play.golang.org/p/gNpS13ED_i

关于json - 在go中解码json时调整结构,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40052543/

相关文章:

c# - 如何在 C# 中将具有等于 "="符号的字符串转换为 json

python - 修改纸条管道中的JSON

go websocket jsonrpc 浏览器连接关闭

javascript - 如何从 Go Web 程序集出现 "throw"JS 错误?

go - 为什么我的 goroutines 没有启动?

json - 无法读取从 json 文件导入的图像 url

javascript - 使用 toJSON() 访问对象的属性

javascript - 搜索 JSON 对象并返回从给定键 :value? 向上一级的键

go - 我怎样才能摆脱这种数据竞争

unit-testing - 以 http 作为包装函数的依赖项的单元测试