- 问题描述
在使用Go语言的Unmarshal
函数将json
数据赋给struct
时,可能会遇到一些出错的情况。
下面是一个例子:
package main
import (
"encoding/json"
"fmt"
)
type Person struct {
Name string
Age int
}
func main() {
var p Person
err := json.Unmarshal([]byte(`{"name": "Alice", "age": "26"}`), &p)
if err != nil {
fmt.Println(err)
}
fmt.Println(p.Name, p.Age)
}
这个例子中,我们将一个json
字符串{"name": "Alice", "age": "26"}
赋给Person
结构体,然后使用Unmarshal
函数进行解析。但是,程序报错了:
json: cannot unmarshal string into Go struct field Person.age of type int
问题原因是json
数据中的age
字段是一个字符串类型,而Person
中的age
字段是整型,无法直接将一个字符串值赋给整型变量。
如果我们不改变程序中的json
数据,那么就无法将其正确地赋给Person
结构体,导致程序出错。
- 解决方法
为了解决这个问题,我们可以做如下修改:
package main
import (
"encoding/json"
"fmt"
"strconv" // 引入 strconv 包,用于字符串和整型之间的转换
)
type Person struct {
Name string
Age int
}
func main() {
var p Person
err := json.Unmarshal([]byte(`{"name": "Alice", "age": "26"}`), &p)
if err != nil {
fmt.Println(err)
}
age, err := strconv.Atoi(p.Age) // 将 p.Age 字符串转换为整型
if err != nil {
fmt.Println(err)
}
p.Age = age // 将转换后的整型值赋给 p.Age
fmt.Println(p.Name, p.Age)
}
这个例子中,我们引入了strconv
包,用于将string
类型的p.Age
字段转换为int
类型。
首先,我们使用Unmarshal
函数将json
数据赋给Person
结构体。然后,我们使用strconv.Atoi
函数将p.Age
字符串转换为整型变量,并将其保存在age
变量中。
如果转换失败,我们需要处理错误。最后,我们将age
变量赋值给Person
结构体中的Age
字段,完成赋值操作。
这样,我们就可以正确地将json
数据赋给Person
结构体了。
- 示例说明
下面再给出一个更为复杂的示例,用于进一步说明如何使用Unmarshal
函数赋值。
package main
import (
"encoding/json"
"fmt"
)
type Address struct {
City string
Country string
}
type Person struct {
Name string
Age int
Addr Address
Phones []string
}
func main() {
var p Person
err := json.Unmarshal([]byte(`{
"name": "Alice",
"age": 26,
"addr": {
"city": "Hangzhou",
"country": "China"
},
"phones": ["123456", "987654"]
}`), &p)
if err != nil {
fmt.Println(err)
}
fmt.Println(p.Name, p.Age, p.Addr.City, p.Addr.Country, p.Phones)
}
这个例子中,我们定义了一个Person
结构体,其中包含了一个嵌套的Address
结构体和一个string
类型的切片Phones
。
我们使用Unmarshal
函数将一个复杂的json
字符串赋给Person
结构体。然后,我们可以通过Person
结构体中的各个字段访问json
数据的各个属性。
- 总结
在使用Go语言的Unmarshal
函数将json
数据赋给struct
时,需要注意数据类型的匹配。如果json
数据中的值类型和struct
中定义的类型不匹配,可以使用一些类型转换函数解决问题。
在处理复杂的json
数据时,可以定义嵌套的结构体来表示不同层次的数据结构,然后使用Unmarshal
函数逐层解析数据。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Go 使用Unmarshal将json赋给struct出错的原因及解决 - Python技术站