Golang json: cannot unmarshal object into Go value of type错误

别人项目代码如下

var seedUrls []string
    // read and parse json,相对路径
    b, err := ioutil.ReadFile(confPath + "/" + conf.UrlListFile) //[91 10 32 32 ...]
    if err != nil {
        l4g.Error("readfile err[%s]", err)
        SlowExit()
    }
    //json to []string
    if err := json.Unmarshal(b, &seedUrls); err != nil { //把上面的b转换为[http://www.baidu.com]形式的字符切片
        l4g.Error("parse json err[%s]", err)
        SlowExit()
    }

我的测试代码

jsonStr := `{"Name":"lepig", "Age":100}`
    abc := []byte(jsonStr)

    var result []string
    if err := json.Unmarshal(abc, &result); err != nil {
        fmt.Println(err)
        return
    }
    fmt.Println(result)

在学习golang 看别的一个项目json解析这里没看明白。我的测试代码运行报错。但是我要是把我测试代码里的
var result []string修改为var result interface{}就可以。 不明白的是,别人项目里的声明的var seedUrls []string为什么就可以

PS: 有php基础,感觉学习golang很多东西不能快速理解。不知道如何入门

阅读 33.8k
3 个回答

{"Name":"lepig", "Age":100}JSON Object,无法反序列化到[]string。比如用["a","b","c"]就能反序列化到[]string了。

你需要定义一个结构体,因为golang是静态强类型语言

由于你的json数据传递的是一个对象,所以接受的Go类型应该是一个结构体。
别人项目中的代码应该传入的b,应该是一个字符串数组形式的json数据,例如:["abcd","1234"],所以可以使用Go类型的[]string接收。
对于楼主使用的var result interface{}由于interface可以接收任何类型所以可以使用。

修改方式:
定义一个结构体类型

type User struct{
    Name string
    Age    int
}
var result User 
if err := json.Unmarshal(abc, &result); err != nil {
        fmt.Println(err)
        return
    }
fmt.Println(result)
撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题