json - 如何修复json : cannot unmarshal object into Go value of type []json. RawMessage

标签 json go struct slice

我想解码

var j = []byte(`[{"major":1},{"minor":0}]`)
进入
type Version struct {
    Major int `json:"major"`
    Minor int `json:"minor"`
}
通过循环内部 slice 使用自定义拆组器:
func (h *Version) UnmarshalJSON(b []byte) error {
    var wrapper []json.RawMessage

    err := json.Unmarshal(b, &wrapper)
    if err == nil {
        for _, v := range wrapper {
            if err = json.Unmarshal(v, &h); err != nil {
                break
            }
        }
    }

    return err
}
内部UnmarshalJSON触发器
json: cannot unmarshal object into Go value of type []json.RawMessage
这很奇怪,因为目标是*Version。怎么了播放:https://play.golang.org/p/Av59IkYTioS

最佳答案

“内部”解码调用将递归调用Version.UnmarshalJSON():

json.Unmarshal(v, &h)
您的错误来自于递归调用:您尝试将{"major":1}解码为[]json.RawMessage
您不想递归调用Version.UnmarshalJSON(),因此请创建一个剥离所有方法(包括UnmarshalJSON())的新类型:
    type version Version
    h2 := (*version)(h)
    for _, v := range wrapper {
        if err = json.Unmarshal(v, &h2); err != nil {
            break
        }
    }
进行此更改后,它将起作用,并添加fmt.Println(msg)输出将是(在Go Playground上尝试):
<nil>
{1 0}
通常,这会导致堆栈溢出错误,但是由于您的第二次调用错误,递归会中断。参见相关:Call json.Unmarshal inside UnmarshalJSON function without causing stack overflow

关于json - 如何修复json : cannot unmarshal object into Go value of type []json. RawMessage,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/66238481/

相关文章:

go - CGO : Undefined symbols for architecture x86_64

c - 理解链表C中的递归函数

c++ - C中的填充结构

javascript - Reactjs 搜索 json

java - 当使用 Spring Boot Rest Controller 中的其他实体引用映射到 Hibernate 实体的 JSON 时,Jackson InvalidTypeIdException

python - 在 Flask 中提供动态生成的文件

c - 带结构前缀的初始化是什么意思?

json - 无法将类为 'parseDate' 的对象 'java.lang.String' 转换为 grails 中的类 'java.util.Date'

go - 不能使用 ResponseErrorWriter 文字(类型 ResponseErrorWriter)作为 GO 中的类型错误

go - 有没有办法使用 Go 的 `flag` 包捕获所有无法识别的命令行标志?